Índice


  1. Introducción a R y Rstudio

    1.1. Definición de R

    1.2. Definición de Rstudio

    1.3. R vs. Rstudio

    1.4. ¿Por qué utilizar R como lenguaje de programación?

    1.5. Exploración de R y Rstudio

  2. Programación básica

    2.1. Paquetes y librerías

    2.1.1. Concepto de función y vector

    2.1.2. Uso de paquetes y librerías, exploración de funciones

    2.2. La ayuda

    2.3. Directorio de trabajo

    2.4. Vectores

    2.4.1. Concepto de vector y propiedades

    2.4.2. Uso de vectores para obtener dataframes

    2.4.3. Diferencia entre lista y vector

    2.4.4. Operaciones básicas con vectores

    2.5. Otro tipo de objetos

    2.6. Recomendaciones de programación

    2.6.1. Recomendaciones de programación y flujo de trabajo en R

    2.6.2. Ejemplo completo

  3. Trabajo reproducible: desde programación colaborativa a control de versiones

    3.1. Obtención y tratamiento de datos: flujo de trabajo y tipos de datos

    3.2. GitHub

    3.3. Archivos rmd, Rmarkdown

  4. Obtención y tratamiento aplicado a la ciencia de datos

    4.1. Tidyverse

    4.1.1. ¿Qué es tidyverse?

    4.1.2. Resolución de un problema ambiental con tidyverse

    4.2. Representación gráfica con ggplot

    4.2.1. Tipos de gráficos

    4.2.2. Sintaxis de ggplot

  5. Visualización de datos

    5.1. R como GIS

    5.1.1. ¿Qué son los sistemas GIS o SIG?

    5.1.2. Utilización de R como GIS

    5.1.3. Ejemplos de su uso

    5.1.4. Extracción de datos biológicos de la distribución de las especies a partir de GBIF

    5.1.5. Extracción de información apartir de raster, uso del paquete raster

    5.2. Mapas de puntos con ggplot


1. Introducción a R y Rstudio

En este primer bloque nos familiarizamos con R y Rstudio.

1.1. Definición de R

R es un lenguaje de programación que en un principio fue creado para análisis estadístico, pero es mucho más que eso:

  • R es de código abierto (por lo que evoluciona constantemente adaptándose a las nuevas necesidades de los usuarios) y de libre acceso (por lo que todo el que quiera puede acceder a él, lo que ayuda a su evolución).

  • R ayuda al desarrollo del estado del arte al recopilar análisis y técnicas realizadas en código en investigaciones de un área de conocimiento concreta.

  • Es flexible y potente, pudiendo manejar bases de datos inmensas

  • Portátil y replicable en otras plataformas

  • En el existen ejemplos para casi cualquier análisis, sirviendo de guía o inspiración para nuevos investigadores

  • Todo es por y para la comunidad de forma que todas las mejoras de R van destinadas a suplir las necesidades de sus usuarios, y los usuarios tratan de hacer el código más accesible para los demás.

R, además, es muy versátil ya que en él existen una gran cantidad de paquetes, para la visualización, análisis y manipulación de datos.

R comparte muchas características con la ciencia:

  • Es gratuito

  • Es de código abierto

  • Es colaborativo

Con lo cual R se puede utilizar para investigaciones científicas, solo debemos asegurarnos de que las investigaciones sean replicables.

1.2. Definición de Rstudio

En cambio, Rstudio es un IDE (es decir, un entorno de desarrollo integrado (integrated development environment)) gratuito y en código abierto creado exclusivamente para R.

Así Rstudio no sería más que una interfaz de R , una “aplicación” que nos hace más sencillo trabajar con R.

Rstudio tiene las siguientes características:

  • Se produce un resaltado de la sintaxis, en ocasiones se autocompleta el código y la sangría se mantiene sola, estos aspectos ayudan al usuario a escribir un código más limpio y a escoger los términos correctos en cada ocasión.

  • Permite ejecutar el código directamente desde el editor del código fuente

  • Permite saltar rápidamente entre funciones definidas

  • Permite la colaboración

  • Presenta una potente autoría y una gran capacidad de depuración, de forma que es el propio Rstudio el que avisa de posibles errores en el código, permite generar documentos dinámicos, etc.

1.3. R vs. Rstudio

Al comparar el entorno de R y Rstudio observamos grandes diferencias:

  • La principal diferencia es que el entorno de R es mucho más sencillo que en Rstudio, en R podemos observar una barra de herramientas en la parte superior y la ventana principal de la consola y en caso de que abriésemos un script observaríamos la ventana de este. En cambio, en Rstudio el entorno es claramente más complejo, la barra de herramientas de la parte superior es mucho más compleja y diferenciamos hasta cuatro ventanas diferentes, una para los scripts, otra para la consola, otra para el ambiente de trabajo donde se reflejan las variables y datos guardados y una cuarta ventana donde se muestra la ayuda, gráficos e incluso los archivos del ordenador para abrirlos más fácilmente si fuese necesario, todas estas ventanas poseen diferentes pestañas por las que navegar.

  • Otra diferencia es la clave de colores que podemos observar en ambos entornos. En R solo hay dos colores, uno para el texto escrito con almohadillas (#), es decir, texto no ejecutable; y otro para el texto ejecutable. En cambio, en Rstudio existe un código de que colores que además de distinguir el texto ejecutable del no ejecutable diferencia entre los distintos caracteres (por ejemplo, los paréntesis, corchetes y flechas de asignación son de un color diferente al del resto del texto, y el texto entre comillas es de otro color diferente)

  • Otra diferencia importante es que en R no existen avisos de errores, o sugerencias de código, como sucede en Rstudio.

Simplemente al observar estas diferencias se pone de manifiesto que Rstudio facilita enormemente el trabajo con R.

1.4. ¿Por qué utilizar R como lenguaje de programación?

Beneficios de R

R es un lenguaje de programación complejo que se asemeja al propio lenguaje humano y que va mucho más allá del análisis estadístico. Una razón para trabajar con R sería esta, ya que al ser un lenguaje que se asemeja al humano resulta más intuitivo de utilizar, a pesar de su inmensa complejidad.

Otra razón es que gracias a sus características permite desarrollar trabajos reproducibles a nivel científico.

Nota personal

En la actualidad se pretende fomentar el desarrollo de la ciencia reproducible, de forma que no solo el manuscrito sino también los datos y el código empleado estén disponibles a la comunidad científica, lo cual aceleraría el avance en el conocimiento.

A nivel académico la reproducibilidad es importante al facilitar la colaboración, la verificación y el avance en la ciencia.

Pero a nivel de las empresas también es importante ya que permite la reutilización del código lo que ahorra tiempo, por ejemplo.

1.5. Exploración de R y Rstudio

Hemos realizado una exploración previa de R y Rstudio.

En R hemos realizado un ejemplo de una operación básica:

10e-78+10e-40
FALSE [1] 1e-39

En Rstudio hemos creado una variable e instalado un paquete:

a <- 45+7
        
install.packages("lattice", repos = "http://cran.us.r-project.org")
FALSE Installing package into 'C:/Users/tsuba/OneDrive/Documentos/R/win-library/4.1'
FALSE (as 'lib' is unspecified)
FALSE package 'lattice' successfully unpacked and MD5 sums checked
FALSE Warning: cannot remove prior installation of package 'lattice'
FALSE Warning in file.copy(savedcopy, lib, recursive = TRUE):
FALSE problem copying C:\Users\tsuba\OneDrive\Documentos\R\win-
FALSE library\4.1\00LOCK\lattice\libs\x64\lattice.dll to C:
FALSE \Users\tsuba\OneDrive\Documentos\R\win-library\4.1\lattice\libs\x64\lattice.dll:
FALSE Permission denied
FALSE Warning: restored 'lattice'
FALSE 
FALSE The downloaded binary packages are in
FALSE   C:\Users\tsuba\AppData\Local\Temp\RtmpQ9ItmP\downloaded_packages
library(lattice)

demo(lattice)
FALSE 
FALSE 
FALSE   demo(lattice)
FALSE   ---- ~~~~~~~
FALSE 
FALSE > require(grid)
FALSE Loading required package: grid
FALSE 
FALSE > old.prompt <- devAskNewPage(TRUE)
FALSE 
FALSE > ## store current settings, to be restored later
FALSE > old.settings <- trellis.par.get()
FALSE 
FALSE > ## changing settings to new 'theme'
FALSE > trellis.par.set(theme = col.whitebg())
FALSE 
FALSE > ## simulated example, histogram and kernel density estimate superposed
FALSE > x <- rnorm(500)
FALSE 
FALSE > densityplot(~x)
FALSE Error : The fig.showtext code chunk option must be TRUE

FALSE 
FALSE > histogram(x, type = "density", 
FALSE +           panel = function(x, ...) {
FALSE +               panel.histogram(x, ...) 
FALSE +               panel.densityplot(x, col = "brown", plot.points = FALSE)
FALSE +           })
FALSE Error : The fig.showtext code chunk option must be TRUE

FALSE 
FALSE > ## Using a custom panel function to superpose a fitted normal density
FALSE > ## on a Kernel Density Estimate
FALSE > 
FALSE > densityplot( ~ height | voice.part, data = singer, layout = c(2, 4),  
FALSE +             xlab = "Height (inches)",
FALSE +             ylab = "Kernel Density\n with Normal Fit",
FALSE +             main = list("Estimated Density", cex = 1.4, col = "DarkOliveGreen"),
FALSE +             panel = function(x, ...) {
FALSE +                 panel.densityplot(x, ...)
FALSE +                 panel.mathdensity(dmath = dnorm,
FALSE +                                   args = list(mean=mean(x),sd=sd(x)))
FALSE +             } )
FALSE Error : The fig.showtext code chunk option must be TRUE

FALSE 
FALSE > ## user defined panel functions and fonts
FALSE > 
FALSE > states <- data.frame(state.x77,
FALSE +                      state.name = dimnames(state.x77)[[1]], 
FALSE +                      state.region = factor(state.region)) 
FALSE 
FALSE > xyplot(Murder ~ Population | state.region, data = states, 
FALSE +        groups = state.name,
FALSE +        panel = function(x, y, subscripts, groups)  
FALSE +        ltext(x = x, y = y, labels = groups[subscripts],
FALSE +              cex=.9, fontfamily = "HersheySans", fontface = "italic"),
FALSE +        par.strip.text = list(cex = 1.3, font = 4, col = "brown"),
FALSE +        xlab = list("Estimated Population, July 1, 1975", font = 2),
FALSE +        ylab = list("Murder Rate (per 100,000 population), 1976", font = 2),
FALSE +        main = list("Murder Rates in US states", col = "brown", font = 4))
FALSE Error : The fig.showtext code chunk option must be TRUE

FALSE 
FALSE > ##graphical parameters for xlab etc can also be changed permanently
FALSE > trellis.par.set(list(par.xlab.text = list(font = 2),
FALSE +                      par.ylab.text = list(font = 2),
FALSE +                      par.main.text = list(font = 4, col = "brown")))
FALSE 
FALSE > ## Same with some multiple line text
FALSE > levels(states$state.region) <-
FALSE +     c("Northeast", "South", "North\n Central",  "West")
FALSE 
FALSE > xyplot(Murder  ~ Population | state.region, data = states,
FALSE +        groups = as.character(state.name),
FALSE +        panel = function(x, y, subscripts, groups)
FALSE +        ltext(x = x, y = y, labels = groups[subscripts], srt = -50, col = "blue",
FALSE +              cex=.9, fontfamily = "HersheySans"),
FALSE +        par.strip.text = list(cex = 1.3, font = 4, col = "brown", lines = 2),
FALSE +        xlab = "Estimated Population\nJuly 1, 1975", 
FALSE +        ylab = "Murder Rate \n(per 100,000 population)\n 1976", 
FALSE +        main = "Murder Rates in US states")
FALSE Error : The fig.showtext code chunk option must be TRUE

FALSE 
FALSE > ##setting these back to their defaults
FALSE > trellis.par.set(list(par.xlab.text = list(font = 1),
FALSE +                      par.ylab.text = list(font = 1),
FALSE +                      par.main.text = list(font = 2, col = "black")))
FALSE 
FALSE > ##levelplot
FALSE > 
FALSE > levelplot(volcano, colorkey = list(space = "top"),
FALSE +           sub = "Maunga Whau volcano", aspect = "iso")
FALSE Error : The fig.showtext code chunk option must be TRUE

FALSE 
FALSE > ## wireframe
FALSE > wireframe(volcano, shade = TRUE,
FALSE +           aspect = c(61/87, 0.4),
FALSE +           screen = list(z = -120, x = -45),
FALSE +           light.source = c(0,0,10), distance = .2,
FALSE +           shade.colors.palette = function(irr, ref, height, w = .5)
FALSE +           grey(w * irr + (1 - w) * (1 - (1-ref)^.4)))
FALSE Error : The fig.showtext code chunk option must be TRUE

FALSE 
FALSE > ## 3-D surface parametrized on a 2-D grid
FALSE > 
FALSE > n <- 50
FALSE 
FALSE > tx <- matrix(seq(-pi, pi, length.out = 2*n), 2*n, n)
FALSE 
FALSE > ty <- matrix(seq(-pi, pi, length.out = n) / 2, 2*n, n, byrow = T)
FALSE 
FALSE > xx <- cos(tx) * cos(ty)
FALSE 
FALSE > yy <- sin(tx) * cos(ty)
FALSE 
FALSE > zz <- sin(ty)
FALSE 
FALSE > zzz <- zz
FALSE 
FALSE > zzz[,1:12 * 4] <- NA
FALSE 
FALSE > wireframe(zzz ~ xx * yy, shade = TRUE, light.source = c(3,3,3))
FALSE Error : The fig.showtext code chunk option must be TRUE

FALSE 
FALSE > ## Example with panel.superpose. 
FALSE > 
FALSE > xyplot(Petal.Length~Petal.Width, data = iris, groups=Species, 
FALSE +        panel = panel.superpose,
FALSE +        type = c("p", "smooth"), span=.75,
FALSE +        col.line = trellis.par.get("strip.background")$col,
FALSE +        col.symbol = trellis.par.get("strip.shingle")$col,
FALSE +        key = list(title = "Iris Data", x = .15, y=.85, corner = c(0,1),
FALSE +            border = TRUE, 
FALSE +            points = list(col=trellis.par.get("strip.shingle")$col[1:3],
FALSE +            pch = trellis.par.get("superpose.symbol")$pch[1:3],
FALSE +            cex = trellis.par.get("superpose.symbol")$cex[1:3]
FALSE +            ),
FALSE +            text = list(levels(iris$Species))))
FALSE Error : The fig.showtext code chunk option must be TRUE

FALSE 
FALSE > ## non-trivial strip function
FALSE > 
FALSE > barchart(variety ~ yield | year * site, barley, origin = 0,
FALSE +          layout = c(4, 3),
FALSE +          between = list(x = c(0, 0.5, 0)),
FALSE +          ## par.settings = list(clip = list(strip = "on")),
FALSE +          strip =
FALSE +          function(which.given,
FALSE +                   which.panel,
FALSE +                   factor.levels,
FALSE +                   bg = trellis.par.get("strip.background")$col[which.given],
FALSE +                   ...) {
FALSE +              axis.line <- trellis.par.get("axis.line")
FALSE +              pushViewport(viewport(clip = trellis.par.get("clip")$strip,
FALSE +                                    name = trellis.vpname("strip")))
FALSE +              if (which.given == 1)
FALSE +              {
FALSE +                  grid.rect(x = .26, just = "right",
FALSE +                            name = trellis.grobname("fill", type="strip"),
FALSE +                            gp = gpar(fill = bg, col = "transparent"))
FALSE +                  ltext(factor.levels[which.panel[which.given]],
FALSE +                        x = .24, y = .5, adj = 1,
FALSE +                        name.type = "strip")
FALSE +              }
FALSE +              if (which.given == 2)
FALSE +              {
FALSE +                  grid.rect(x = .26, just = "left",
FALSE +                            name = trellis.grobname("fill", type="strip"),
FALSE +                            gp = gpar(fill = bg, col = "transparent"))
FALSE +                  ltext(factor.levels[which.panel[which.given]],
FALSE +                        x = .28, y = .5, adj = 0,
FALSE +                        name.type = "strip")
FALSE +              }
FALSE +              upViewport()
FALSE +              grid.rect(name = trellis.grobname("border", type="strip"),
FALSE +                        gp =
FALSE +                        gpar(col = axis.line$col,
FALSE +                             lty = axis.line$lty,
FALSE +                             lwd = axis.line$lwd,
FALSE +                             alpha = axis.line$alpha,
FALSE +                             fill = "transparent"))
FALSE +          }, par.strip.text = list(lines = 0.4))
FALSE Error : The fig.showtext code chunk option must be TRUE

FALSE 
FALSE > trellis.par.set(theme = old.settings, strict = 2)
FALSE 
FALSE > devAskNewPage(old.prompt)

2. Programación básica

Hemos revisado conceptos básicos sobre R.

2.1. Paquetes y librerías

2.1.1. Concepto de función y vector

Una función reúne una serie de operaciones que se ejecutan como un todo, y que se pueden almacenar para usarlas cuando sea necesario siempre tiene una entrada y una salida.

Un vector es una consecución de números.

En clase hemos trabajado con diferentes funciones y hemos diferentes creado vectores para afianzar estos conceptos.

1+1
FALSE [1] 2
a= (1+1) # creación de un objeto
      
b <- 3+1 # es mejor nombrar con flechas (primero < y luego -)
      
c <- 4+2 # el shortcut es Alt + -
      
d<- c (1,2) # para construir un vector se hace con c (concatenar) 
            # y la serie de números que quieras entre paréntesis 
            #separados por coma.
      
sum(b) # sum es la función de suma, como vemos resume una operación
FALSE [1] 4
sum(d,c,b)
FALSE [1] 13
str (a) # esta función te permite ver la estructura del objeto
FALSE  num 2

2.1.2. Uso de paquetes y librerías, exploración de funciones

Un paquete y una librería son prácticamente lo mismo. Una librería o paquete es una consecución de funciones que nos permiten trabajar más fácilmente en R.

Instalar un paquete

install.packages("tidyverse", repos = "http://cran.us.r-project.org") 
FALSE Installing package into 'C:/Users/tsuba/OneDrive/Documentos/R/win-library/4.1'
FALSE (as 'lib' is unspecified)
FALSE package 'tidyverse' successfully unpacked and MD5 sums checked
FALSE 
FALSE The downloaded binary packages are in
FALSE   C:\Users\tsuba\AppData\Local\Temp\RtmpQ9ItmP\downloaded_packages
# con esta función se descargan e instalan paquetes

#el parámetro de "repos" se ha añadido posteriormente porque surgía un error, lo mismo ha sucedido con la instalación de ciertos paquetes 

Uso de un paquete

A pesar de haber instalado el paquete solo podremos usar sus funciones si se lo indicamos a R, es decir, debemos llamar al paquete para poder utilizar sus funciones, y para ello usamos al función library, un símil para entenderlo podría ser entender la función install.packages como comprar un libro en una librería, mientras que la función library sería como coger ese libro de la estantería para leerlo.

library(tidyverse) # para cargar librería
FALSE -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
FALSE v ggplot2 3.3.5     v purrr   0.3.4
FALSE v tibble  3.1.6     v dplyr   1.0.8
FALSE v tidyr   1.2.0     v stringr 1.4.0
FALSE v readr   2.1.2     v forcats 0.5.1
FALSE -- Conflicts ------------------------------------------ tidyverse_conflicts() --
FALSE x dplyr::filter() masks stats::filter()
FALSE x dplyr::lag()    masks stats::lag()

Instalamos y cargamos posteriormente la librería raster:

install.packages("raster", repos = "http://cran.us.r-project.org")
FALSE Installing package into 'C:/Users/tsuba/OneDrive/Documentos/R/win-library/4.1'
FALSE (as 'lib' is unspecified)
FALSE package 'raster' successfully unpacked and MD5 sums checked
FALSE 
FALSE The downloaded binary packages are in
FALSE   C:\Users\tsuba\AppData\Local\Temp\RtmpQ9ItmP\downloaded_packages
library (raster)  
FALSE Loading required package: sp
FALSE 
FALSE Attaching package: 'raster'
FALSE The following object is masked from 'package:dplyr':
FALSE 
FALSE     select

Concepto y exploración de un dataframe:

Un dataframe no es más que una tabla de datos, podemos tener datos cualitativos y cuantitativos, cada fila es una observación y las columnas son las variables.

Para explorar un dataframe podemos utilizar diferentes funciones:

names(iris) # para decirme las variables de este dato
FALSE [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"
str(iris) # me dice la estructura de esta variable
FALSE 'data.frame': 150 obs. of  5 variables:
FALSE  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
FALSE  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
FALSE  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
FALSE  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
FALSE  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
petal <- select (iris, Petal.Width) # así me da error, porque
FALSE Error in (function (classes, fdef, mtable) : unable to find an inherited method for function 'select' for signature '"data.frame"'
                                          # select es una función que sale en 
                                          # el paquete de raster y de tidyverse,
                                          # le tengo que decir de quién quiero 
                                          # que lo use

Así para seleccionar que “select” queremos usar utilizaremos dplyr que es un paquete que contiene funciones para la manipulación de dataframes, al usar los :: indicamos que queremos utilizar select de este paquete.

petal <- dplyr::select (iris, "Petal.Width")

Ahora vamos a quitar datos del dataframe.

nuevo2 <-  dplyr::select (iris, - "Petal.Width")# para hacer cosas
                                                    # debemos nombrar la tabla
                                                    # y la variable que quiero
          
dim(iris) # dimensiones de tabla
FALSE [1] 150   5
nuevo <- 1:10
    
dim(nuevo) # Rstudio genera un warning si haces referencia a un objeto 
FALSE NULL
               # que no esta previamente definido en el script

También podemos eliminar columnas, a la hora de eliminar columnas existen varias formas de realizarlo, puede realizarse indicando la posición de la columna (lo cual es lo más habitual ya que es un proceso más rápido y cómodo) o bien puede realizarse indicando el nombre de la variable, lo cual es más reproducible, ya que independientemente de que cambiemos la posición de la columna siempre nos estaremos refiriendo a ella.

new <- iris[,-4] # quitas las cuarta columna
    
# Shorcut de corchetes en mi teclado, Alt gr + A0 (a con la o encima)
          
new <- iris[,-("Petal.Width")]  #con nombre es más reproducible ya
FALSE Error in -("Petal.Width"): invalid argument to unary operator
                                         # que la posición puede cambiar

new2 <-  iris [,1:3]
          
new3 <-  iris [,c(1:3)]# de estas dos maneras es correcto los : son los 
                       # rangos, izquierda son filas y derecha columnas

new4 <-  iris[1:10,1:3] # elijó las primeras 10 filas (observaciones), 
                        # y las 3 primeras columnas

Cabe destacar que los rangos solo son válidos con posiciones, los nombres son carácteres y no los localiza, para hacerlo con nombres se tiene que escribir todos los nombres de esas columnas. Un ejemplo sería:

col_13 <- iris[1:10,1:3]

col_13_names <- iris[, c("Sepal.Length","Sepal.Width","Petal.Length")]

Dentro del dataframe podemos seleccionar columnas específicas utilizando la siguiente estructura dataframe$variable1.

Con la función mean calculamos la media:

mean(col_13)# da error, porque col_13 es un dataframe no un vector,
FALSE Warning in mean.default(col_13): argument is not numeric or logical: returning
FALSE NA
FALSE [1] NA
            # tiene 4 vectores
            # na= son valores que desconoce, que no están disponibles
      
mean (col_13$"Petal.Lenght") # aquí estoy haciendo la media de una 
FALSE Warning in mean.default(col_13$Petal.Lenght): argument is not numeric or
FALSE logical: returning NA
FALSE [1] NA
                             # variable o columna por lo que si funciona

Finalmente con la función data podemos cargar dataframes aportados por los paquetes en el ambiente de trabajo:

data(iris)

Shorcuts interesantes

Otros shorcuts interesantes son:

* Para poner sección es ctrl + shift + r

* Para guardar ctrl + s

2.2. La ayuda

La ayuda de Rstudio es un elemento sumamente práctico que nos permite encontrar información sobre las funciones y ejemplo de su uso.

Existen varias formas de usar la ayuda a través de la consola. Podemos usar una interrogación:

?mean # al ejecutarlo se abre una página donde se describe su
FALSE starting httpd help server ... done
      # funcionamiento y se pone un ejemplo de cómo se utiliza
      
?? weighted.mean # busca las páginas de ayuda donde se menciona el
                         # término
help.search("weighted.mean") # realiza la misma función que ??

Podemos encontrar información sobre paquetes también:

help (package = "dplyr")

Además de las funciones str y summary que nos dan información sobre una variable, podemos usar class para saber el tipo de variable:

class (iris)
FALSE [1] "data.frame"

Ejemplo reproducible

Si aún habiendo usado estas funciones sigues sin resolver tus problemas o dudas, puedes acudir a foros online para que otros usuarios te ayuden, pero para que te puedan ayudar debes crear un ejemplo reproducible.

Un ejemplo reproducible es un ejemplo del código que te esta dando problemas, que es simplificado, pero con todas las partes para que se reproduzca tu problema y con diferentes datos.

A este respecto, existen paquetes de R como reprex para generar estos ejemplos.

2.3. Directorio de trabajo

A la hora del directorio de trabajo existen varias funciones:

getwd() # para saber cual es nuestro directorio de trabajo
FALSE [1] "C:/Users/tsuba/OneDrive/Escritorio/MANUAL"
setwd() # para seleccionar el directorio de trabajo, de esta manera
FALSE Error in setwd(): argument "dir" is missing, with no default
        # se selecciona el directorio en el que nos encontramos
        #se puede hacer con la pestañita, pero mejor no , ya que si
        # se hace en el script queda registrado
    
setwd("C:/Users/tsuba/OneDrive/Escritorio/MANUAL")

# Entre comillas y con barras
# SHORCUT DE MI TECLADO: para la barra al revés Alt gr + tecla de grados

Proyectos

Recomiendan trabajar con proyectos, cada proyecto lo suyo es que sea de un proyecto de análisis. Los proyectos son en realidad una “especie” carpeta de trabajo, es realmente una forma de organización.

Pipa, funcionamiento y concepto

La Pipa o %>% es un carácter que en el código me indica dentro de..., un ejemplo sería:

iris%>%
  dplyr::select (
    "Species", "Sepal.Width", "Petal.Lenght")%>%
  filter(iris [,1:3])
FALSE Error in `dplyr::select()`:
FALSE ! Can't subset columns that don't exist.
FALSE x Column `Petal.Lenght` doesn't exist.
# %>% funciona como el del $, pero con más cosas

¿Cómo crear una función?

Algunos usuarios por su propia comodidad generan sus propias funciones, para crear una función se sigue la siguiente estructura nombre <- function (dataframe, x=variable){df[,x]}

Donde las llaves indican lo que hacen las funciones

Importante: las funciones que creas aquí son tuyas, para que se hagan públicas las tienes que poner en github o publicar un paquete público de R.

Notas personales

La función select es para columnas, filter hace los mismo pero para las observaciones o filas, se suele poner el nombre de la variable.

En mi teclado las llaves se ponen con Alt gr + A con dieresis

2.4. Vectores

2.4.1. Concepto de vector y propiedades

Un vector es conjunto de datos del mismo tipo, dispuestos en serie (uno detrás de otro), es una sola columna, una única variable, si es de una dimensión sería un escalar.

Los vectores presentan las siguientes propiedades o características:

- Tipo de dato, así los vectores pueden ser:

- Numéricos (pudiendo ser número enteros o dobles (decimales))

- Factor (pudiendo tener varios niveles)

- Carácteres

- De fecha

- Boleano (de unos y ceros / verdadero-falso)

- Tamaño/ longitud

- Atributos/metadatos adicionales

Con los vectores se pueden realizar operaciones básicas donde + se utiliza para sumas, - para restas, * para multiplicación (en mi teclado es shift + tecla de exponente), / para división y ^ para exponentes (en mi teclado es shift + A con o).

Ejemplo 1: entender las propiedades de los vectores

Para averiguar las propiedades de un vector se pueden usar diferentes funciones.

Primero creamos un vector de altura:

altura <- c(1.65,1.70, 1.45, 1.56, 1.75)

Observamos sus propiedades:

typeof(altura) # Tipo
FALSE [1] "double"
length(altura) # Tamaño
FALSE [1] 5
# NOTA: el asistente inteligente puede salir automático o buscarlo con
# el tabulador y bajar con flechas para seleccionar
        
attributes(altura) # Atributo, NOTA: null indica que no hay nada que enseñar
FALSE NULL

Funciones que nos los enseñan todo serian:

str(altura) # Muestra el tipo y longitud
FALSE  num [1:5] 1.65 1.7 1.45 1.56 1.75
summary(altura) # También nos muestra el tipo (en caso de una variable
FALSE    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
FALSE   1.450   1.560   1.650   1.622   1.700   1.750
                # numérica calcula los percentiles y media, en una
                # variable tipo caracter indica el tipo de dato y
                # el tamaño o longitud del vector)

A continuación vamos a hacer una distribución normal de media 1.70 y desviación estándar 0.15, para lo cual debemos buscar la función adecuada y utilizamos la ayuda:

??norm # Sabemos que el término norm se usa para normal, así que 
       # buscamos todas las entradas con este término, al final vemos
       # que en el paquete stats se menciona norm para una distribución
       # normal y al pinchar vemos distintas funciones y las exploramos
      
?dnorm # un compañero comenta que puede ser esta, así que la exploramos,
       # al explorarla vemos que no nos sirve

En realidad, la función adecuada es rnorm y es la que usamos, ya que esta usa el número de observaciones, ya que dnorm usa un vector de cuantiles.

altm <- rnorm (5, mean=1.74, sd=0.15) # Si no pongo  mean y sd sigue
                                      # funcionando igual por el orden 
                                      # de estos argumentos
        
altm <- rnorm (5, 1.74, 0.15) # Como es comentado funciona igual

Ahora con summary comparamos como se ajusta nuestro vector a la distribución normal:

summary(altura)
FALSE    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
FALSE   1.450   1.560   1.650   1.622   1.700   1.750
summary(altm) 
FALSE    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
FALSE   1.616   1.715   1.754   1.776   1.857   1.937

Al comparar observamos que nuestra media es menor a la media de la distribución normal, somos más bajitos.

Debate, ¿ponemos o no los argumentos?

Depende de la situación. Si tenemos que enseñar nuestro código a alguien o si tenemos pensado revisar el script más adelante, lo mejor es ponerlo, ya que la lectura es más sencilla y no tenemos que memorizar. En cambio, si es para algo rápido sobre lo que probablemente no volvamos a trabajar, lo mejor es no ponerlo, ya que nos ahorra tiempo.

Nota personal

Existen dos tipos de programación, una programación funcional y una programación orientada a objetos. La primera está más orientada a funciones, donde el usuario expresa lo que quiere hacer, haciendo que la programación sea más intuitiva y fácil de leer, R sería un lenguaje de programación funcional.

Ejemplo 2: trabajo con figuras

Ahora vamos a recordar cómo realizar gráficos y figuras y cómo guardarlas. Para ello trabajaremos con los vectores que hemos creado anteriormente sobre la altura (altura y altm).

Algunas funciones para generar gráficos son:

plot(altura) # genera un gráfico de dispersión
FALSE Error : The fig.showtext code chunk option must be TRUE

boxplot(altura) # caja de bigotes
FALSE Error : The fig.showtext code chunk option must be TRUE

hist(altura) # histograma
FALSE Error : The fig.showtext code chunk option must be TRUE

Lo que queremos es generar una sola figura que contenga, un gráfico de dispersión, una caja de bigotes y un histograma para las variables altura y altm, y así poderlas comparar más fácilmente.

Como queremos guardar dicha figura, lo primero que haremos será usar la función tiff. Cabe mencionar que tiff es una función que permite guardar una figura o imagen en formato tiff, este es un formato del paquete raster, en el que definimos la cantidad de píxeles por unidad de medida. Este código debe de ejecutarse antes de la figura o imagen que deseamos guardar.

Para saber como funciona tiff utilizamos la ayuda y a continuación lo usamos, también utilizaremos par para que todas las figuras se ejecuten a la vez y nos salgan en la misma imagen.

?tiff 
x11() # añadido posteriormente ya que nos daba error, esto permite
      # abrir una nueva ventana si te da error al ejecutar par
       
tiff(filename = "ejemplo",# aquí puedes eligir una subcarpeta poniendo
                          #la dirección
     width = 100, height = 250, units = "mm",
     res= 300) # si no pones comillas los caracteres se consideran 
               # objetos
        
?par
        
par(mfrow= c(3,2))# Aquí estamos definiendo la disposición que
                  # queremos,así definimos que queremos 3 filas
                  # con 2 columnas
                  # Aunque originalmente definimos 2 filas y 3 
                  #  columnas a mi parecer con esta disposición se
                  # entiende mejor.

plot(altura, # aquí con type podrías elegir el tipo de gráfico 
             # pero por defecto es un gráfico de puntos
     col = "aquamarine4", # "col" define el color
     ylab = "Altura (m)",
     main = "Altura de clase", # "main" es el título
     pch = 16 )  # "pch" define el tipo de punto,
FALSE Error : The fig.showtext code chunk option must be TRUE
                 # en total hay 25 tipos, el tamaño de los puntos
                 # también se puede cambiar con "cex"

plot(altm, col = "darkcyan", ylab = "Altura (m)",
     main = "Altura de España", pch = 16)
FALSE Error : The fig.showtext code chunk option must be TRUE
boxplot(altura, main = "Altura de clase", col = "lightpink") 
FALSE Error : The fig.showtext code chunk option must be TRUE
boxplot(altm, main = "Altura de España", col = "coral2" )
FALSE Error : The fig.showtext code chunk option must be TRUE
hist(altura, ylab = "Altura (m)", main = "Altura de clase",
     col = "palegreen3")
FALSE Error : The fig.showtext code chunk option must be TRUE
hist(altm, ylab = "Altura (m)", main = "Altura de España",
     col = "seagreen4")
FALSE Error : The fig.showtext code chunk option must be TRUE
dev.off() # para cerrar gráfico, y poder hacer otro nuevo 
FALSE png 
FALSE   2
# Tras ejecutar "dev.off" sale el mensaje de null device
Inciso, formatos de imagen

Para guardar imágenes hay dos formatos posibles en formato vectorial y en formato foto.

2.4.2. Uso de vectores para obtener dataframes

Creación de vectores con rep

A través de la repetición de los datos un vector podemos genera vectores de mayor tamaño.

altura <- c(1.65,1.70, 1.45, 1.56, 1.75)
        
altura2 <-  rep(altura, 30) # Produce la repetición de los valores del
                            # vector altura, en este caso 30 veces

A continuación vamos a trabajar con otra variable, la variable genero, donde anotaremos nuestro género en clase:

genero <- rep(c("mujer", "hombre"), c(3,2)) # con "rep" estamos 
                                            # consiguiendo repetir 
                                            # "mujer" 3 veces y 
                                            # "hombre" 2 veces

Pero hasta ahora la variable genero es considerada como un vector de tipo carácter, pero para nosotros es un factor con 2 niveles o categorías nominales: mujer y hombre. Por ello, vamos a trasformar la variable genero en un factor usando la función as.factor:

genero_clase <-  as.factor (genero)#como factor

Observamos las diferencias entre las variable genero y genero_clase:

typeof(genero)
FALSE [1] "character"
str(genero)
FALSE  chr [1:5] "mujer" "mujer" "mujer" "hombre" "hombre"
summary(genero)
FALSE    Length     Class      Mode 
FALSE         5 character character
typeof(genero_clase)
FALSE [1] "integer"
str(genero_clase)
FALSE  Factor w/ 2 levels "hombre","mujer": 2 2 2 1 1
summary(genero_clase)
FALSE hombre  mujer 
FALSE      2      3

Función seq y creación de dataframes

Para unir tablas estas deben tener datos del mismo tipo.

La función seq genera secuencias aleatorias de números de una determinada cantidad de observaciones. En el ejemplo de abajo definimos que queremos una secuencia de números entre el valor mínimo y el valor máximo del vector altura, teniendo un total de 10000 observaciones.

seqalt <- seq( from =min(altura), to = max (altura),
               length= 10000)
        
View(seqalt) # Ahora observamos el vector creado con esta función 
             # (primera letra en mayúsculas)
        
boxplot(seqalt, main= "Altura (muestra aleatoria)", 
        col = "cornflowerblue") # generamos un boxplot para visualizar 
FALSE Error : The fig.showtext code chunk option must be TRUE

                                # más fácilmente los datos

Ahora procedemos a generar una matriz de datos a partir de este vector númerico doble. Para ello, simplemente rompemos el vector seqalt en una matriz de cuatro columnas usando la función matrix:

?matrix # Para saber utilizar esta función consultamos a la ayuda
        
alt <-  matrix(data= seqalt, nrow =100,
               ncol=4, byrow=F) # Como defino el número de filas que
                                # quiero que tenga en realidad estoy 
                                # acortando el dataframe
        
alt <-  matrix(data= seqalt,
               ncol=4, byrow=F) # Si quito el nrow, R es inteligente
                                # y me parte todo de la forma adecuada
                                # una matriz es un vector con 
                                # dimensiones, entonces byrow me dice
                                # que me lo parte siguiendo filas o 
                                # columnas, de forma default es 
                                # columnas que es como se hace bien
                                # una matriz tiene el mismo numero de
                                # filas, es un dataframe no es 
                                # una matriz
        
View(alt) # Observamos la matriz que hemos generado

A continuación vamos a realizar el dataframe completo:

Vamos a generar un dataframe compuesto por dos variables, por un ladO el dato numérico de la altura registrado, y por otro el rango de valores al que pertenece dicho valor.

En primer lugar, vamos a hacer un vector tipo factor o carácter que me rompan en 3 partes iguales la muestra, los puntos de división que vamos a establecer son:X < cuantil 25,25 < x < 75 (entre el cuantil 25 y el 75) y X > cuantil 75.

Para ello primero buscaremos los cuantiles:

quantile (seqalt)
FALSE    0%   25%   50%   75%  100% 
FALSE 1.450 1.525 1.600 1.675 1.750
quantile( seqalt, 0.25)
FALSE   25% 
FALSE 1.525
quantile(seqalt, 0.75)# estos cuantiles son mis puntos de corte
FALSE   75% 
FALSE 1.675

Con los puntos de corte crearemos un vector en el que se definen los intervalos en los que se dividirá el vector seqalt, este nuevo vector se llama intervalos:

?cut
        
intervalos <- cut (seqalt, breaks= c(min(seqalt), # le pongo los puntos 
                                                  # de mínimo, medio y 
                                                  # máximo
                                     quantile(seqalt, 0.25),
                                     quantile(seqalt, 0.75),
                                     max(seqalt)))
        
data <-  data.frame (seqalt, intervalos)# puede ser así haciéndolo por
                                        # separado o todo junto como
                                        # abajo
        
data <-  data.frame (seqalt, 
                     kk=cut (seqalt, breaks= c(min(seqalt),
                                               quantile(seqalt, 0.25),
                                               quantile(seqalt, 0.75),
                                               max(seqalt)),
                             labels = c("<0.25", "0.25-0.75", ">0.75")))
        
        
summary(data) # vemos un resumen del dataframe
FALSE      seqalt              kk      
FALSE  Min.   :1.450   <0.25    :2499  
FALSE  1st Qu.:1.525   0.25-0.75:5000  
FALSE  Median :1.600   >0.75    :2500  
FALSE  Mean   :1.600   NA's     :   1  
FALSE  3rd Qu.:1.675                   
FALSE  Max.   :1.750
boxplot(data$seqalt~data$kk,
        col = "coral1") # representamos los datos de cada intervalo
FALSE Error : The fig.showtext code chunk option must be TRUE

                        # el primero es la y , y el segundo es la x

2.4.3. Diferencia entre lista y vector

La principal diferencia entre un vector y una lista, es que un vector es una serie de datos del mismo tipo, mientras que una lista puedeestar compuesta por elementos de distinto tipo.

NOTA: El shortcut para ir al paréntesis correspondiente Ctrl + p

2.4.4. Operaciones básicas con vectores

Funciones matemáticas con vectores

Hay numerosas funciones que podemos usar:

  • log(x): logaritmo natural

  • exp(x): exponencial

  • max(x): máximo

  • min(x): mínimo

  • round(x,n): redondear decimales

  • cor(x): correlación

  • sum(x): suma

  • mean(x): media

  • median(x): mediana

  • quantile(x): cuantil

  • rank(x): ranking de elementos

  • var(x): varianza

  • sd(x): desviación estándar

Operadores lógicos y relacionales

  • > : mayor que

  • < : menor que

  • > = : mayor o igual que

  • < = : menor o igual que

  • = = : exactamente igual a

  • ! = : No igual a

  • ! : lógico NO

  • &: lógico Y

  • | : lógico O (ctrl + 1)

  • && : Y con IF

  • || : O con IF

  • %in% : que contiene

2.5. Otro tipo de objetos

Además de vectores, existen otro objetos que almacenan información y con los que ya hemos trabajado.

Están las matrices, las matrices son vectores con atributos de dimensión, es decir, se trata de un objeto homogéneo (formado por un mismo tipo de dato, como un vector)y formado por dos dimensiones (observaciones y variables, es decir, filas y columnas, los vectores están formados únicamente por observaciones, son una fila)

También encontramos listas, un objeto formado por una dimensión (solo observaciones) y de datos diferentes (heterogéneos).

Por último, están los dataframes, que son objetos heterogéneos (formado por diferentes tipos de datos) con 2 dimensiones (filas y columnas).

Estos tipos de objetos se pueden interconvertir entre ellos, a través de diferentes funciones:

  • De vector a un vector más largo: c(x,y)

  • De matriz a vector: as.vector(mymatrix)

  • De vector a matriz: cbind(x,y), rbind(x,y)

  • De dataframe a matriz: as.matrix(myframe)

  • De vector a dataframe: data.frame(x,y)

  • De matriz a dataframe: as.data.frame(mymatrix)

2.6. Recomendaciones de programación

En este apartado vamos a ver recomendaciones para la escritura del código.

2.6.1. Recomendaciones de programación y flujo de trabajo en R

1). Comprobar que en global options no esté marcado R restore data, ya que si se restaura, al trabajar con datos muy grandes hace que tarde más en abrirse Rstudio.

2). Generar un proyecto organizado, ¿Cómo?:

  • Generando carpetas para los tipos de archivos, por ejemplo:

    • Datos, donde se recogiesen los dataframe que voy a usar en un proyecto:
      • una carpeta para los scripts

      • una carpeta de output (figuras, tablas y resultados)

      • una carpeta de informe (con un rmarkdown)

    Se pueden numerar las carpetas para que sigan un orden lógico en el que los usarías o generarías. En m,i caso yo realizaría primero la carpeta de scripts, posteriormente, datos, resultados y finalmente el informe; en cambio la profesora seguiría el orden de primero los datos, segundo scripts, despues resultados y finalmente informe. La creación de una gran cantidad de subcarpetas supone un problema y es que el directorio de trabajo se tendría que cambiar más veces, ya que tienes que especificar esas subcarpetas en el directorio de trabajo (directorio de trabajo es el sitio donde se guarda el script).

  • Nombres de los archivos, asegurandonos de elegir un nombre que sea memorable (fácil de recordar) y que nos ayude a identificar el contenido o tipo de archivo. A.EJEMPLO: ¿Qué nombre es el más correcto para un script que ajusta modelos? 1. ajuste-modeloR 2. a-modR El mejor sería el primero ya que es completo y fácil de recordar, el segundo, pasado un tiempo ya no te acuerdas.

3). El código debe tener una buena sintaxis y que sea fácil de leer:

  • Documenta el código/ comenta el código para que los demás lo entiendan o lo entiendas tu tiempo después. No hay que comentar todo, decirlo de forma resumida y que tenga estructura.

  • Usar nombres memorable y correctos:para que nombres sean correctos hay que tener en cuenta que r es sensible a mayúscula y minúscula. Las palabras deben de estar separadas por un guión bajo, y asignar nombres claros. EJEMPLO ¿Cuál sería correcta? 1. mi_vector -> correcto 2. MiVector 3. vector.1

Inciso, revistas científicas y citación

Una revista científica recoge artículos de revisión, investigación, etc; que mantiene un formato concreto.

Todas las publicaciones científicas están revisadas. Las fuentes fiables de información muestran datos como: autores, revista, editor, etc. Se pueden citar y referenciar conocimiento previo, metodologías y bases de datos. También se debe citar el software y paquete usado. Las citas textuales solo se pone apellido y año.

Un repositorio es un sitio web donde se almacenan muchos datos.

¿Cómo buscar información en estos?: Podemos buscar información de muchas maneras, en bases de datos, usando palabras clave, buscando a un autor específico, etc.

Algunas bases de datos son easy web of knowdelge y scopus, incluso en buscadores como google scholar.

A la hora de buscar un artículo, el criterio para seleccionar los artículos más relevantes es guiarse por:

  1. Mayor número de citas

  2. Filtrar el área de conocimiento del artículo para escoger artículos de áreas relevantes en nuestro estudio

  3. Intentar seleccionar artículos de revisión, ya que resumen el conocimiento actual sobre el tema

  4. Escoger artículos recientes ya que tratan los últimos descubrimientos del tema

Si encontramos un artículo que nos inspire debemos guardarlo, ya que puede resultar útil para investigaciones futuras.

Inciso, regla de oro para escribir

Para escribir un documento lo más apropiado es un tema, un párrafo. Debemos pensar estructura y nombres para nuestro proyecto de prácticas.

REGLAS DE NUESTRA SINTAXIS
  1. Poner espacio después de la coma, no antes: x[, 1] -> SÍ x[,1] -> NO

  2. Sin espacio antes/ paréntesis: mean(x, na.rm = T) mean (x, na.rm = T) ¿Por qué? pues porque son los argumentos de la función es como si fuese una palabra, por ello no se pone espacio.

  3. Antes y después de una flecha de asignación, = , tabulación, etc; deja un espacio, ayuda a leer. a <- 1 a<-1

  4. Corregir sintaxis del manual, la tabulación son los espacios que quedan al escribir entre varias lineas:

a1 <-  c(1,
        2,
        3)

# estos espacios

4). Estructura el código y piensa las secciones:

  • Ejemplos de secciones:

    1. Directorio de trabajo (si no fuese un proyecto)

    2. Instalación los paquetes y librerías que vayas a usar (al principio)

    3. Cargar datos

    4. Analizar los datos

    5. Obtener y guardar los resultados

Cuestiones de clase

¿Para qué usarías nombre y verbo?

El nombre para variables y el verbo para resultados de una función. Consejo: evitar nombres que sean comunes de funciones y variables Para ampliar estas recomendaciones mira en la página web: https://style.tidyverse.org/

¿Qué es mejor hacer un script único con secciones o con varios script?

En principio si esta organizado da igual, si se rompe y los script Deben ejecutarse secuencialmente, deben numerarse para evitar errores.

NOTA : tabulación es la tecla encima de mayúsculas (flechitas) y alt+ tabulación permite pasar entre ventanas.

Inciso: Extensiones de los archivos

Cada archivo tiene una determinada extensión y la extensión me indica el tipo de archivo: - txt es separado por / # es un texto plano - csv es separado por , - xls pueden tener diferentes hojas para unos datos determinados - access es mdb es como un punto mas que excel - excel tiene varios problemas, por ejemplo, un nº limitado de columnas

¿Qué es github?

Git es como hacer proyectos, pero en vez de tenerlo en el programa lo tienes en la nube, así tienes control de versiones mucho más fácilmente, además de que se puede compartir.

2.6.2. Ejemplo completo

Para poner en práctica todas estas recomendaciones realizaremos un ejemplo completo. En este ejemplo vamos a seguir el hilo de mi práctica y realizaremos un estudio de la biodiversidad de aves según tipo de uso del suelo.

Aquí vamos a usar la librería dplyr y ggplot2, en caso de no estar instaladas las debemos instalar:

install.packages(c("dplyr", "ggplot2"), dep=T) 
FALSE Warning: packages 'dplyr', 'ggplot2' are in use and will not be installed
#dep, es dependencies and construction, significa que te instalará
#y descargará lo que le haga falta para los paquetes
        
library("dplyr") # lo llamas

Generamos un dataframe con datos aleatorios:

x <- data.frame(id = seq(from = 1, to =100),
                uso = rep(c("A", "B"), times = 50),
                riqueza = rnorm (100, mean = 3, sd = .5))
        
? write.csv

write.csv(x, file= "C:/Users/tsuba/OneDrive/Escritorio/MANUAL/1-datos brutos/diversidad_usos.csv")

# Guardamos el dataframe como un csv, en la dirección se debe cambiar la posición de la barra.

Ahora leemos el dataframe (lo cargamos):

?read.csv
datos <- read.csv("C:/Users/tsuba/OneDrive/Escritorio/MANUAL/1-datos brutos/diversidad_usos.csv")
        
View (datos)

Al observar los datos vemos que se ha generado una nueva columna, esta columna llamada X se corresponde con datos id que se han generado automáticamente en la tabla.

Vemos las características del dataframe:

str(datos) # la mejor forma
FALSE 'data.frame': 100 obs. of  4 variables:
FALSE  $ X      : int  1 2 3 4 5 6 7 8 9 10 ...
FALSE  $ id     : int  1 2 3 4 5 6 7 8 9 10 ...
FALSE  $ uso    : chr  "A" "B" "A" "B" ...
FALSE  $ riqueza: num  2.54 3.92 3.31 3.35 3.04 ...
summary (datos) # te indica hasta los NA (sin datos)
FALSE        X                id             uso               riqueza     
FALSE  Min.   :  1.00   Min.   :  1.00   Length:100         Min.   :1.821  
FALSE  1st Qu.: 25.75   1st Qu.: 25.75   Class :character   1st Qu.:2.733  
FALSE  Median : 50.50   Median : 50.50   Mode  :character   Median :3.011  
FALSE  Mean   : 50.50   Mean   : 50.50                      Mean   :3.021  
FALSE  3rd Qu.: 75.25   3rd Qu.: 75.25                      3rd Qu.:3.354  
FALSE  Max.   :100.00   Max.   :100.00                      Max.   :3.925

¿Cómo podemos quitar la columna autogenerada que sobra?, para ello usaremos el código de abajo, donde - resta una columna.

datos1 <- datos[,-1] # quito la primera columna que es un 
                     # autonumérico

A continuación vamos a analizar nuestro dataframe, donde Haremos la media y sd (desviación típica) de riqueza, para cada nivel del uso del suelo.

names (datos1) # para saber mis variables
FALSE [1] "id"      "uso"     "riqueza"
mean(datos1$riqueza)
FALSE [1] 3.020719

Podemos usar tapply(), esta agrupa los datos de un vector de acuerdo a otra variable categórica y una función.

Quiero ver la media de la riqueza en función del uso del suelo:

summary(datos1$uso) # me lo considera como algo lineal, entonces 
FALSE    Length     Class      Mode 
FALSE       100 character character
                    # me da error el tapply

summary(as.factor(datos1$uso)) # ahora que lo veo como factor 
FALSE  A  B 
FALSE 50 50
                               #  y si me lo coge
        
medaves <- tapply(datos1$riqueza, datos1$uso, FUN = mean)
        
sdaves<- tapply(datos1$riqueza, datos1$uso, FUN = sd) # todo esto 
                                                      # hay que ir                                                                     # guardándolo                                                                    # en carpetas                                                                    # específicas
resumen_aves <- data.frame (medaves, sdaves)

write.csv(resumen_aves, "C:/Users/tsuba/OneDrive/Escritorio/MANUAL/1-datos brutos/resumen_aves.csv")

Finalmente haremos un boxplot de riqueza en función del suelo A y B y lo guardaremos en una carpeta de resultados.

?boxplot
      
      
tiff(filename = "C:/Users/tsuba/OneDrive/Escritorio/MANUAL/1-datos brutos/plot_aves.tiff",
     width= 700,height = 100, units="mm", res = 300 )

aves <-  boxplot(riqueza ~ uso, data= datos1,
                 xlab = "Usos del suelo",
                 ylab = "riqueza de aves", col = "indianred2")
FALSE Error : The fig.showtext code chunk option must be TRUE

3. Trabajo reproducible: desde programación colaborativa a control de versiones

En este apartado hablaremos sobre flujo de trabajo, tipos de datos, github y Rmarkdown, centrándonos especialmente en los archivos rmd.

3.1.Obtención y tratamiento de datos: flujo de trabajo y tipos de datos

A la hora de trabajar debemos seguir siempre un flujo de trabajo donde:

1.Partimos de una pregunta o problema

2.Plantearnos que datos necesitamos usar y donde los podemos conseguir

3.Trabajar con los datos donde:limpieza, análisis y visualización

4.Mostrar los resultados

¿Y qué son los datos?

No son más que una colección de: hechos, observaciones, medidas, etc.

Tipos de datos

Existen muchas clasificaciones diferentes dependiendo de la aproximación que sigamos:

  • Datos cuantitativos y cualitativos

  • Datos crudos y procesados

  • En función del soporte: analógico, digital, vídeo-audio, etc.

  • En función de su formato: tablas, vectores, matrices, mapas, etc.

  • En función de sus dimensiones:

    • Vector: 1 dimensión

    • Matriz: 2 dimensiones (se pueden organizar en dataframes o en tibble)

    • Arreglos: varias dimensiones

    • Listas

  • En función de la temática: geográficos, estadísticos, científicos, financieros, meteorológicos, etc.

Los archivos que contienen los datos pueden tener extensiones muy diferentes, por ejemplo: txt, pdf, tiff, xml, csv, etc.

Hay enlaces a muchos repositorios en la presentación de obtención y tratamiento de datos, revisa la presentación…

3.2. GitHub

Es una plataforma online donde se comparte código de R entre desarrolladores, cualquier usuario tiene acceso a los códigos y paquetes publicados en esta plataforma, y puede crear sus propios repositorios. Además, github también permite establecer un control de versiones en los proyectos de forma que ayuda a que los trabajos sean más reproducibles.

De manera que esta plataforma permite que el trabajo con R sea más colaborativo y reproducible, además de ayudar al desarrollo de R como lenguaje de programación.

Git y GitHub para el control de versiones

En este aspecto Git es un sistema de control de versiones abierto que funciona como el control de cambios de Word. Mientras que GitHub funciona a modo de almacén para nuestros proyectos en internet. Git y GitHub fueron creados en un principio para grupos de programadores pero se puede aplicar a cualquier grupo de trabajo.

¿Por qué usar un control de versiones?

Porque todos los cambios se quedan almacenados permitiéndonos volver a versiones anteriores del documento y recuperar cualquier elemento de una versión anterior. Además, también se registra quién realizó los cambios, en qué fecha y por qué, de manera que facilita el trabajo en grupo.

Repositorios

Los repositorios permiten almacenar documentos y proyectos en GitHub, y pueden ser tanto públicos (donde cualquier usuario puede acceder) o privado.

Los repositorios se organizan en ramas o “branches”, donde cada rama permite un desarrollo de trabajo diferente a mi entender, las ramas funcionan a modo de subcarpetas, tenemos una rama principal (“main”), donde se trabaja con el proyecto. Se pueden generar ramas independientes (otras carpetas), donde se este trabajando con otros proyectos distintos o con partes diferentes del proyecto, y posteriormente estas ramas pueden fusionarse con la principal (meter una carpeta dentro de otra).

Las nuevas ramas se generan por medio de los “pull and request”.

Issues

El apartado de issues funciona a modo de un foro, donde una persona abre un “issue” o tema para preguntar algo o para pedir ayuda, y las personas que tienen compartido ese repositorio pueden acceder a ese “issue” y tratar de responder a la duda o resolver el problema concreto.

3.3. Archivos rmd, Rmarkdown

Los archivos rmd son un tipo de documentos con una extensión propia de rmarkdown que actúan como intermediarios entre un script y un output definitivo, por ejemplo un archivo html.

En un archivo rmd tenemos dos elementos principales, código ejecutable o chunk, el cual se engloba en una especie de recuadro ejecutable; y un elemento de texto que no es ejecutable y que funciona de la misma manera que un procesador de texto. Al inicio del archivo rmd existe un cuadro de opciones (que se conoce como Yaml, Yaml header o preámbulo; y se escribe en lenguaje Yaml), donde se pueden definir aspectos del output, como por ejemplo el tipo de documento que se generará (pdf, html, word, etc) e incluso se pueden definir parámetros estéticos, como el tipo y color de letra en temas personalizados.

Cuando un archivo rmd se “teje” o “knit” (es un compilador, es decir, compila una serie de instrucciones y las traduce a otro lenguaje como puede ser html) se genera el output final definido en el Yaml. En el output se ejecutan todos los chunks (código) y el texto adquiere un formato concreto que se define en el documento rmd, donde, por ejemplo, el número almohadillas (#) al inicio del texto define el tamaño de los títulos.

En este bloque hemos estado trabajando directamente sobre un archivo rmd.

Con rmarkdown también se pueden crear presentaciones powerpoint y archivos shiny (que se caracterizan por ser documentos dinámicos e interactivos).

Sobre Rmarkdown

Rmarkdown es un lenguaje de marcado (al igual que lo es html, no es un lenguaje de programación). Rmarkdown carece de funciones aritméticas. Un lenguaje de marcado es un lenguaje con marcas y etiquetas que sirven de dictado para que un software siga unas determinadas especificaciones.

4. Obtención y tratamiento aplicado a la ciencia de datos

A lo largo de este bloque aprenderemos a manejar los datos y a visualizarlos por medio de diferentes tipos de gráficos. En este bloque trabajaremos mayoritariamente con el paquete ggplotde tidyverse.

4.1. Tidyverse

4.1.1. ¿Qué es tidyverse?

tidyverse es una colección de paquetes de R que engloba un total de 8 paquetes con funciones diferentes:

  • readr: que se utiliza para leer datos

  • dplyr: para la manipulación de datos

  • tibble

  • tidyr

  • purrr

  • stringr

  • forcats

  • ggplot2: para la visualización de datos

Con tidyverse se pueden realizar todas las funciones de rbase (que es el conjunto de funciones que vienen preinstaladas al descargar R), pero de forma más intuitiva y simplificada. La gran ventaja del uso de tidyverse, aparte de que simplifica enormemente el código, es que todos los paquetes que contiene y todas las funciones de dichos paquetes tienen una sintaxis similar (haciendo que la nomenclatura sea consistente), lo cual hace que sea mucho más intuitivo y sencillo de utilizar que rbase.

Por lo general la sintaxis de tidyverse se caracteriza por utilizar “_” en vez de “.”

Otras ventajas con respecto rbase son que las funciones de tidyverse son mucho más rápidas que las de rbase, añade automáticamente los formatos de fecha y tiempo, y que muestra una barra de carga para mostrar el estado de carga de los datos.

Aquí vamos a centrarnos en el trabajo con dplyr.

4.1.2. Resolución de un problema ambiental con tidyverse

A lo largo de esta clase vamos a intentar resolver un problema ambiental, pero antes de comenzar vamos a cargar varias librerías:

library(here)
FALSE here() starts at C:/Users/tsuba/OneDrive/Escritorio/MANUAL
library(patchwork)
FALSE 
FALSE Attaching package: 'patchwork'
FALSE The following object is masked from 'package:raster':
FALSE 
FALSE     area
library(viridis)
FALSE Loading required package: viridisLite
library(ggpmisc)
FALSE Loading required package: ggpp
FALSE 
FALSE Attaching package: 'ggpp'
FALSE The following object is masked from 'package:ggplot2':
FALSE 
FALSE     annotate
library(tidyverse)# Al cargar este paquete nos salen conflictos, esto se debe a
                  # que funciones de un paquete están enmascaradas por funciones
                  # de otro paquete, simplemente a la hora de usar dichas funciones
                  # debemos tener en cuenta de que paquete la queremos utilizar y definirlo

El problema ambiental a resolver es el siguiente:

En el ayuntamiento de Alcalá de Henares Hay discrepancias entre los políticos sobre la influencia del ser humano en el cambio climático. Algunos piensan que el cambio climático no existe, otros piensan que el cambio climático si existe pero que no se debe a la influencia humana y otros piensan que el sr humano si influye en el cambio climático, ya que existen innumerables evidencias científicas que lo corroboran.

Para resolver este problema hemos necesitado los siguientes datos:

Para resolver este problema ambiental trabajaremos con todos y cada uno de los paquetes de tidyverse.

El planteamiento para resolverlo es el siguiente:

  • Vamos a representar comoa medida que aumenta el CO2 aumenta la temperatura, de esta manera el CO2 es la variable independiente y temperatura es la dependiente. De esta manera mostramos que existe el cambio climático.

  • Para evidenciar el efecto del ser humano en el cambio climático podemos ver como varían la temperatura y niveles de CO2 con el tiempo y luego disgregar los datos de CO2 en sectores para ver su origen.

A. Descargar los datos

Antes de comenzar a utilizar tidyverse debemos descargar los datos climáticos y de CO2 para Alcalá de Henares, para esto utilizaremos el paquete easyclimate:

Primero debemos instalar el paquete.

install.packages("easyclimate")# no podemos, porque no esta en el cran, que es donde
FALSE Installing package into 'C:/Users/tsuba/OneDrive/Documentos/R/win-library/4.1'
FALSE (as 'lib' is unspecified)
FALSE Error in contrib.url(repos, "source"): trying to use CRAN without setting a mirror
                               # están las librerías oficiales de R, por eso tenemos
                               # que instalarlo con remotes
        
install.packages("remotes")# como carecíamos de este paquete lo hemos tenido que instalar
FALSE Installing package into 'C:/Users/tsuba/OneDrive/Documentos/R/win-library/4.1'
FALSE (as 'lib' is unspecified)
FALSE Error in contrib.url(repos, "source"): trying to use CRAN without setting a mirror
remotes::install_github("VeruGHub/easyclimate")# así es como se instala, entre comillas
FALSE Skipping install of 'easyclimate' from a github remote, the SHA1 (b66c099f) has not changed since last install.
FALSE   Use `force = TRUE` to force installation
                                               # es la dirección del repositorio de
                                               # Github donde se encuentra

Cargamos la librería easylimate.

library(easyclimate)

Definimos las coordenadas de la región de donde queremos descargarnos los datos.

coords <- data.frame(
          lon = -3.35,
          lat = 40.48
          )

Se representa un mapa, aunque esto no lo hemos realizado en clase, y esto simplemente nos señala en un mapa la posición de Alcalá de Henares.

ggplot() +
  borders(regions = c("Spain", "Portugal", "France")) +
  geom_point(data = coords, aes(x = lon, y = lat)) +
  coord_fixed(xlim = c(-10, 2), ylim = c(36, 44), ratio = 1.3) +
  xlab("Longitude") +
  ylab("Latitude") +
  theme_bw()
FALSE Error : The fig.showtext code chunk option must be TRUE

Con este código descargaríamos los datos de temperatura de Alcalá de Henares con el paquete easyclimate, no ejecutamos este código porque estos datos de temperatura y los datos de CO2 ya los tenemos descargados.

# temp <- get_daily_climate(
#   coords,
#   period = 1950:2020, 
#   climatic_var = c("Tmin", "Tmax")
#   )
        
# save(temp, file = "00-raw/temp.RData")
# load(here("00-raw", "temp.RData"))

B. Uso de readr

Este paquete nos permite cargar datos.

Datos de CO2

Comenzamos cargando los datos de CO2

A la hora de cargar los datos hemos visto varios errores, que hemos ido resolviendo sobre la marcha.

# En primer lugar hemos trabajado con el paquete de rbase

co_data <- read.csv("intro_tidyverse-dplyr-main/01-data/co2.csv")
#  Cuando estábamos trabajando en clase no lo encontraba, porque el archivo rmd 
# en el que trabajamos estaba en otra carpeta diferente a la de datos

# Para resolverlo en clase usamos ".." que indica que salimos de la carpeta donde 
# nos encontramos con el rmd.

# Posteriormente hemos pasado a trabajar con tidyverse.

# Con tidyverse podemos utilizar el paquete here, que nos facilita mucho el trabajo
here()
FALSE [1] "C:/Users/tsuba/OneDrive/Escritorio/MANUAL"
co_data <- read_csv(here("intro_tidyverse-dplyr-main", "01-data", "co2.csv"))# pongo "," porque en el paquete here se especifica así, además al poner el guión bajo estoy usando la función read del paquete readr de tidyverse
FALSE Rows: 1036 Columns: 52
FALSE -- Column specification --------------------------------------------------------
FALSE Delimiter: ","
FALSE chr (52): Sector, country_name, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 19...
FALSE 
FALSE i Use `spec()` to retrieve the full column specification for this data.
FALSE i Specify the column types or set `show_col_types = FALSE` to quiet this message.
Datos de temperatura

Aquí hemos utilizado la función read_delim donde tu marcas el elemento que delimita los datos en vez de utilizar read_csv:

temp <-  read_delim (here("intro_tidyverse-dplyr-main", "01-data", "temalcala.csv"), delim =";")
FALSE Rows: 25933 Columns: 6
FALSE -- Column specification --------------------------------------------------------
FALSE Delimiter: ";"
FALSE dbl  (5): ID_coords, lon, lat, Tmin, Tmax
FALSE date (1): date
FALSE 
FALSE i Use `spec()` to retrieve the full column specification for this data.
FALSE i Specify the column types or set `show_col_types = FALSE` to quiet this message.
¿Qué diferencia existe entre la función read de rbase y la de tidyverse?

La principal diferencia es que esta función en tidyverse es mucho más rápida que con rbase, pero al mismo tiempo es más exigente con el código utilizado dando errores muchas más veces pero ayudando a mejorar tu código al mismo tiempo. También puede dar problemas con tildes, y sale una barra de progreso de carga de los datos.

C. Exploración de los datos

Tras cargar los datos realizamos una exploración de los mismos.

Para la exploración de los datos usamos str y summary.

str(co_data)
FALSE spec_tbl_df [1,036 x 52] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
FALSE  $ Sector      : chr [1:1036] "Buildings" "Buildings" "Buildings" "Buildings" ...
FALSE  $ country_name: chr [1:1036] "Afghanistan" "Albania" "Algeria" "Angola" ...
FALSE  $ 1970        : chr [1:1036] "0.58" "0.99" "1.81" "0.12" ...
FALSE  $ 1971        : chr [1:1036] "0.58" "0.99" "1.81" "0.12" ...
FALSE  $ 1972        : chr [1:1036] "0.46" "1.10" "2.11" "0.14" ...
FALSE  $ 1973        : chr [1:1036] "0.57" "1.30" "2.51" "0.14" ...
FALSE  $ 1974        : chr [1:1036] "0.77" "1.41" "2.68" "0.13" ...
FALSE  $ 1975        : chr [1:1036] "0.59" "1.75" "2.97" "0.12" ...
FALSE  $ 1976        : chr [1:1036] "0.48" "1.91" "3.79" "0.09" ...
FALSE  $ 1977        : chr [1:1036] "0.43" "2.02" "3.80" "0.10" ...
FALSE  $ 1978        : chr [1:1036] "0.41" "2.21" "4.46" "0.33" ...
FALSE  $ 1979        : chr [1:1036] "0.48" "2.69" "5.16" "0.56" ...
FALSE  $ 1980        : chr [1:1036] "0.45" "1.73" "5.37" "0.70" ...
FALSE  $ 1981        : chr [1:1036] "0.52" "1.81" "5.84" "0.66" ...
FALSE  $ 1982        : chr [1:1036] "0.60" "1.90" "6.24" "0.38" ...
FALSE  $ 1983        : chr [1:1036] "0.94" "2.01" "7.04" "0.50" ...
FALSE  $ 1984        : chr [1:1036] "0.99" "2.06" "7.76" "0.55" ...
FALSE  $ 1985        : chr [1:1036] "1.28" "2.09" "4.87" "0.60" ...
FALSE  $ 1986        : chr [1:1036] "1.20" "2.20" "5.60" "0.62" ...
FALSE  $ 1987        : chr [1:1036] "0.79" "2.20" "6.01" "0.63" ...
FALSE  $ 1988        : chr [1:1036] "0.85" "2.33" "6.03" "0.75" ...
FALSE  $ 1989        : chr [1:1036] "0.98" "1.53" "6.76" "0.73" ...
FALSE  $ 1990        : chr [1:1036] "1.04" "2.09" "6.59" "0.66" ...
FALSE  $ 1991        : chr [1:1036] "0.99" "1.32" "7.54" "0.69" ...
FALSE  $ 1992        : chr [1:1036] "0.69" "0.57" "7.78" "0.62" ...
FALSE  $ 1993        : chr [1:1036] "0.60" "0.39" "8.23" "0.51" ...
FALSE  $ 1994        : chr [1:1036] "0.63" "0.33" "8.17" "0.63" ...
FALSE  $ 1995        : chr [1:1036] "0.36" "0.33" "8.09" "0.67" ...
FALSE  $ 1996        : chr [1:1036] "0.33" "0.45" "8.31" "0.91" ...
FALSE  $ 1997        : chr [1:1036] "0.36" "0.38" "7.98" "0.91" ...
FALSE  $ 1998        : chr [1:1036] "0.29" "0.29" "8.63" "1.01" ...
FALSE  $ 1999        : chr [1:1036] "0.29" "0.75" "9.09" "1.26" ...
FALSE  $ 2000        : chr [1:1036] "0.21" "0.76" "9.33" "1.05" ...
FALSE  $ 2001        : chr [1:1036] "0.12" "0.80" "9.53" "1.17" ...
FALSE  $ 2002        : chr [1:1036] "0.05" "1.17" "9.89" "1.20" ...
FALSE  $ 2003        : chr [1:1036] "0.03" "1.04" "10.68" "1.26" ...
FALSE  $ 2004        : chr [1:1036] "0.04" "0.88" "11.51" "1.30" ...
FALSE  $ 2005        : chr [1:1036] "0.08" "0.70" "12.50" "1.00" ...
FALSE  $ 2006        : chr [1:1036] "0.11" "0.93" "12.19" "1.96" ...
FALSE  $ 2007        : chr [1:1036] "0.16" "0.72" "13.60" "2.33" ...
FALSE  $ 2008        : chr [1:1036] "0.32" "0.65" "13.57" "2.97" ...
FALSE  $ 2009        : chr [1:1036] "0.47" "0.55" "17.40" "3.51" ...
FALSE  $ 2010        : chr [1:1036] "0.65" "0.56" "16.80" "3.77" ...
FALSE  $ 2011        : chr [1:1036] "0.75" "0.56" "18.57" "4.15" ...
FALSE  $ 2012        : chr [1:1036] "0.75" "0.49" "20.33" "4.61" ...
FALSE  $ 2013        : chr [1:1036] "0.92" "0.56" "22.60" "5.69" ...
FALSE  $ 2014        : chr [1:1036] "0.85" "0.62" "21.57" "5.61" ...
FALSE  $ 2015        : chr [1:1036] "0.86" "0.63" "23.51" "5.06" ...
FALSE  $ 2016        : chr [1:1036] "0.80" "0.62" "23.19" "5.03" ...
FALSE  $ 2017        : chr [1:1036] "0.84" "0.70" "23.91" "4.14" ...
FALSE  $ 2018        : chr [1:1036] "0.86781928" "0.70320991" "25.8825776" "4.191584" ...
FALSE  $ 2019        : chr [1:1036] "0.89489653" "0.71658967" "27.0897153" "4.2916661" ...
FALSE  - attr(*, "spec")=
FALSE   .. cols(
FALSE   ..   Sector = col_character(),
FALSE   ..   country_name = col_character(),
FALSE   ..   `1970` = col_character(),
FALSE   ..   `1971` = col_character(),
FALSE   ..   `1972` = col_character(),
FALSE   ..   `1973` = col_character(),
FALSE   ..   `1974` = col_character(),
FALSE   ..   `1975` = col_character(),
FALSE   ..   `1976` = col_character(),
FALSE   ..   `1977` = col_character(),
FALSE   ..   `1978` = col_character(),
FALSE   ..   `1979` = col_character(),
FALSE   ..   `1980` = col_character(),
FALSE   ..   `1981` = col_character(),
FALSE   ..   `1982` = col_character(),
FALSE   ..   `1983` = col_character(),
FALSE   ..   `1984` = col_character(),
FALSE   ..   `1985` = col_character(),
FALSE   ..   `1986` = col_character(),
FALSE   ..   `1987` = col_character(),
FALSE   ..   `1988` = col_character(),
FALSE   ..   `1989` = col_character(),
FALSE   ..   `1990` = col_character(),
FALSE   ..   `1991` = col_character(),
FALSE   ..   `1992` = col_character(),
FALSE   ..   `1993` = col_character(),
FALSE   ..   `1994` = col_character(),
FALSE   ..   `1995` = col_character(),
FALSE   ..   `1996` = col_character(),
FALSE   ..   `1997` = col_character(),
FALSE   ..   `1998` = col_character(),
FALSE   ..   `1999` = col_character(),
FALSE   ..   `2000` = col_character(),
FALSE   ..   `2001` = col_character(),
FALSE   ..   `2002` = col_character(),
FALSE   ..   `2003` = col_character(),
FALSE   ..   `2004` = col_character(),
FALSE   ..   `2005` = col_character(),
FALSE   ..   `2006` = col_character(),
FALSE   ..   `2007` = col_character(),
FALSE   ..   `2008` = col_character(),
FALSE   ..   `2009` = col_character(),
FALSE   ..   `2010` = col_character(),
FALSE   ..   `2011` = col_character(),
FALSE   ..   `2012` = col_character(),
FALSE   ..   `2013` = col_character(),
FALSE   ..   `2014` = col_character(),
FALSE   ..   `2015` = col_character(),
FALSE   ..   `2016` = col_character(),
FALSE   ..   `2017` = col_character(),
FALSE   ..   `2018` = col_character(),
FALSE   ..   `2019` = col_character()
FALSE   .. )
FALSE  - attr(*, "problems")=<externalptr>
summary(co_data)
FALSE     Sector          country_name           1970               1971          
FALSE  Length:1036        Length:1036        Length:1036        Length:1036       
FALSE  Class :character   Class :character   Class :character   Class :character  
FALSE  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
FALSE      1972               1973               1974               1975          
FALSE  Length:1036        Length:1036        Length:1036        Length:1036       
FALSE  Class :character   Class :character   Class :character   Class :character  
FALSE  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
FALSE      1976               1977               1978               1979          
FALSE  Length:1036        Length:1036        Length:1036        Length:1036       
FALSE  Class :character   Class :character   Class :character   Class :character  
FALSE  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
FALSE      1980               1981               1982               1983          
FALSE  Length:1036        Length:1036        Length:1036        Length:1036       
FALSE  Class :character   Class :character   Class :character   Class :character  
FALSE  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
FALSE      1984               1985               1986               1987          
FALSE  Length:1036        Length:1036        Length:1036        Length:1036       
FALSE  Class :character   Class :character   Class :character   Class :character  
FALSE  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
FALSE      1988               1989               1990               1991          
FALSE  Length:1036        Length:1036        Length:1036        Length:1036       
FALSE  Class :character   Class :character   Class :character   Class :character  
FALSE  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
FALSE      1992               1993               1994               1995          
FALSE  Length:1036        Length:1036        Length:1036        Length:1036       
FALSE  Class :character   Class :character   Class :character   Class :character  
FALSE  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
FALSE      1996               1997               1998               1999          
FALSE  Length:1036        Length:1036        Length:1036        Length:1036       
FALSE  Class :character   Class :character   Class :character   Class :character  
FALSE  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
FALSE      2000               2001               2002               2003          
FALSE  Length:1036        Length:1036        Length:1036        Length:1036       
FALSE  Class :character   Class :character   Class :character   Class :character  
FALSE  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
FALSE      2004               2005               2006               2007          
FALSE  Length:1036        Length:1036        Length:1036        Length:1036       
FALSE  Class :character   Class :character   Class :character   Class :character  
FALSE  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
FALSE      2008               2009               2010               2011          
FALSE  Length:1036        Length:1036        Length:1036        Length:1036       
FALSE  Class :character   Class :character   Class :character   Class :character  
FALSE  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
FALSE      2012               2013               2014               2015          
FALSE  Length:1036        Length:1036        Length:1036        Length:1036       
FALSE  Class :character   Class :character   Class :character   Class :character  
FALSE  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
FALSE      2016               2017               2018               2019          
FALSE  Length:1036        Length:1036        Length:1036        Length:1036       
FALSE  Class :character   Class :character   Class :character   Class :character  
FALSE  Mode  :character   Mode  :character   Mode  :character   Mode  :character
str(temp)
FALSE spec_tbl_df [25,933 x 6] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
FALSE  $ ID_coords: num [1:25933] 1 1 1 1 1 1 1 1 1 1 ...
FALSE  $ lon      : num [1:25933] -3.35 -3.35 -3.35 -3.35 -3.35 -3.35 -3.35 -3.35 -3.35 -3.35 ...
FALSE  $ lat      : num [1:25933] 40.5 40.5 40.5 40.5 40.5 ...
FALSE  $ date     : Date[1:25933], format: "1950-01-01" "1950-01-02" ...
FALSE  $ Tmin     : num [1:25933] 4.38 1.02 0.39 2.17 1.08 -0.88 0.11 2.78 4.66 3.56 ...
FALSE  $ Tmax     : num [1:25933] 9.67 10.59 11.38 14.73 13.11 ...
FALSE  - attr(*, "spec")=
FALSE   .. cols(
FALSE   ..   ID_coords = col_double(),
FALSE   ..   lon = col_double(),
FALSE   ..   lat = col_double(),
FALSE   ..   date = col_date(format = ""),
FALSE   ..   Tmin = col_double(),
FALSE   ..   Tmax = col_double()
FALSE   .. )
FALSE  - attr(*, "problems")=<externalptr>
summary(temp)
FALSE    ID_coords      lon             lat             date           
FALSE  Min.   :1   Min.   :-3.35   Min.   :40.48   Min.   :1950-01-01  
FALSE  1st Qu.:1   1st Qu.:-3.35   1st Qu.:40.48   1st Qu.:1967-10-02  
FALSE  Median :1   Median :-3.35   Median :40.48   Median :1985-07-02  
FALSE  Mean   :1   Mean   :-3.35   Mean   :40.48   Mean   :1985-07-02  
FALSE  3rd Qu.:1   3rd Qu.:-3.35   3rd Qu.:40.48   3rd Qu.:2003-04-02  
FALSE  Max.   :1   Max.   :-3.35   Max.   :40.48   Max.   :2020-12-31  
FALSE       Tmin              Tmax      
FALSE  Min.   :-11.520   Min.   :-1.32  
FALSE  1st Qu.:  3.180   1st Qu.:13.03  
FALSE  Median :  7.950   Median :19.40  
FALSE  Mean   :  8.243   Mean   :20.42  
FALSE  3rd Qu.: 13.630   3rd Qu.:27.83  
FALSE  Max.   : 24.240   Max.   :41.41

También podemos realizar la exploración con View, esta función está bien para ver los datos pero no nos muestra toda la información.

View(co_data)
View(temp)

Podemos ver únicamente una muestra de los datos, para ello podemos usar head, donde nos permite ver los primeros diez datos de los dataframes.

head(co_data)
head(temp)

Finalmente también podemos utilizar glimpse, esta función hace lo mismo que str pero de forma más ordenada.

glimpse(co_data)
FALSE Rows: 1,036
FALSE Columns: 52
FALSE $ Sector       <chr> "Buildings", "Buildings", "Buildings", "Buildings", "Buil~
FALSE $ country_name <chr> "Afghanistan", "Albania", "Algeria", "Angola", "Anguilla"~
FALSE $ `1970`       <chr> "0.58", "0.99", "1.81", "0.12", "0.00", "0.06", "13.19", ~
FALSE $ `1971`       <chr> "0.58", "0.99", "1.81", "0.12", "0.00", "0.06", "13.19", ~
FALSE $ `1972`       <chr> "0.46", "1.10", "2.11", "0.14", "0.00", "0.08", "12.53", ~
FALSE $ `1973`       <chr> "0.57", "1.30", "2.51", "0.14", "0.00", "0.08", "15.03", ~
FALSE $ `1974`       <chr> "0.77", "1.41", "2.68", "0.13", "0.00", "0.06", "15.48", ~
FALSE $ `1975`       <chr> "0.59", "1.75", "2.97", "0.12", "0.00", "0.08", "16.22", ~
FALSE $ `1976`       <chr> "0.48", "1.91", "3.79", "0.09", "0.00", "0.06", "17.57", ~
FALSE $ `1977`       <chr> "0.43", "2.02", "3.80", "0.10", "0.00", "0.07", "18.60", ~
FALSE $ `1978`       <chr> "0.41", "2.21", "4.46", "0.33", "0.00", "0.06", "18.27", ~
FALSE $ `1979`       <chr> "0.48", "2.69", "5.16", "0.56", "0.00", "0.06", "18.80", ~
FALSE $ `1980`       <chr> "0.45", "1.73", "5.37", "0.70", "0.00", "0.06", "18.40", ~
FALSE $ `1981`       <chr> "0.52", "1.81", "5.84", "0.66", "0.00", "0.06", "19.40", ~
FALSE $ `1982`       <chr> "0.60", "1.90", "6.24", "0.38", "0.00", "0.07", "18.64", ~
FALSE $ `1983`       <chr> "0.94", "2.01", "7.04", "0.50", "0.00", "0.04", "20.14", ~
FALSE $ `1984`       <chr> "0.99", "2.06", "7.76", "0.55", "0.00", "0.06", "20.54", ~
FALSE $ `1985`       <chr> "1.28", "2.09", "4.87", "0.60", "0.00", "0.06", "20.83", ~
FALSE $ `1986`       <chr> "1.20", "2.20", "5.60", "0.62", "0.00", "0.07", "20.21", ~
FALSE $ `1987`       <chr> "0.79", "2.20", "6.01", "0.63", "0.00", "0.08", "21.72", ~
FALSE $ `1988`       <chr> "0.85", "2.33", "6.03", "0.75", "0.00", "0.08", "22.63", ~
FALSE $ `1989`       <chr> "0.98", "1.53", "6.76", "0.73", "0.00", "0.09", "21.19", ~
FALSE $ `1990`       <chr> "1.04", "2.09", "6.59", "0.66", "0.00", "0.09", "22.01", ~
FALSE $ `1991`       <chr> "0.99", "1.32", "7.54", "0.69", "0.00", "0.09", "22.12", ~
FALSE $ `1992`       <chr> "0.69", "0.57", "7.78", "0.62", "0.00", "0.08", "22.23", ~
FALSE $ `1993`       <chr> "0.60", "0.39", "8.23", "0.51", "0.00", "0.07", "22.98", ~
FALSE $ `1994`       <chr> "0.63", "0.33", "8.17", "0.63", "0.00", "0.08", "24.08", ~
FALSE $ `1995`       <chr> "0.36", "0.33", "8.09", "0.67", "0.00", "0.08", "24.72", ~
FALSE $ `1996`       <chr> "0.33", "0.45", "8.31", "0.91", "0.00", "0.08", "25.29", ~
FALSE $ `1997`       <chr> "0.36", "0.38", "7.98", "0.91", "0.00", "0.08", "24.76", ~
FALSE $ `1998`       <chr> "0.29", "0.29", "8.63", "1.01", "0.00", "0.04", "24.79", ~
FALSE $ `1999`       <chr> "0.29", "0.75", "9.09", "1.26", "0.00", "0.06", "26.32", ~
FALSE $ `2000`       <chr> "0.21", "0.76", "9.33", "1.05", "0.00", "0.05", "27.00", ~
FALSE $ `2001`       <chr> "0.12", "0.80", "9.53", "1.17", "0.00", "0.04", "25.70", ~
FALSE $ `2002`       <chr> "0.05", "1.17", "9.89", "1.20", "0.00", "0.05", "24.73", ~
FALSE $ `2003`       <chr> "0.03", "1.04", "10.68", "1.26", "0.00", "0.05", "26.97",~
FALSE $ `2004`       <chr> "0.04", "0.88", "11.51", "1.30", "0.00", "0.04", "29.54",~
FALSE $ `2005`       <chr> "0.08", "0.70", "12.50", "1.00", "0.00", "0.04", "31.25",~
FALSE $ `2006`       <chr> "0.11", "0.93", "12.19", "1.96", "0.00", "0.04", "32.83",~
FALSE $ `2007`       <chr> "0.16", "0.72", "13.60", "2.33", "0.00", "0.04", "33.16",~
FALSE $ `2008`       <chr> "0.32", "0.65", "13.57", "2.97", "0.00", "0.03", "37.37",~
FALSE $ `2009`       <chr> "0.47", "0.55", "17.40", "3.51", "0.00", "0.04", "36.48",~
FALSE $ `2010`       <chr> "0.65", "0.56", "16.80", "3.77", "0.00", "0.05", "36.48",~
FALSE $ `2011`       <chr> "0.75", "0.56", "18.57", "4.15", "0.00", "0.04", "33.71",~
FALSE $ `2012`       <chr> "0.75", "0.49", "20.33", "4.61", "0.00", "0.06", "35.48",~
FALSE $ `2013`       <chr> "0.92", "0.56", "22.60", "5.69", "0.00", "0.10", "37.59",~
FALSE $ `2014`       <chr> "0.85", "0.62", "21.57", "5.61", "0.00", "0.07", "38.62",~
FALSE $ `2015`       <chr> "0.86", "0.63", "23.51", "5.06", "0.00", "0.08", "39.36",~
FALSE $ `2016`       <chr> "0.80", "0.62", "23.19", "5.03", "0.00", "0.08", "39.71",~
FALSE $ `2017`       <chr> "0.84", "0.70", "23.91", "4.14", "0.00", "0.06", "38.31",~
FALSE $ `2018`       <chr> "0.86781928", "0.70320991", "25.8825776", "4.191584", "1.~
FALSE $ `2019`       <chr> "0.89489653", "0.71658967", "27.0897153", "4.2916661", "1~
glimpse(temp)
FALSE Rows: 25,933
FALSE Columns: 6
FALSE $ ID_coords <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ~
FALSE $ lon       <dbl> -3.35, -3.35, -3.35, -3.35, -3.35, -3.35, -3.35, -3.35, -3.3~
FALSE $ lat       <dbl> 40.48, 40.48, 40.48, 40.48, 40.48, 40.48, 40.48, 40.48, 40.4~
FALSE $ date      <date> 1950-01-01, 1950-01-02, 1950-01-03, 1950-01-04, 1950-01-05,~
FALSE $ Tmin      <dbl> 4.38, 1.02, 0.39, 2.17, 1.08, -0.88, 0.11, 2.78, 4.66, 3.56,~
FALSE $ Tmax      <dbl> 9.67, 10.59, 11.38, 14.73, 13.11, 10.87, 8.28, 12.06, 9.99, ~

D. Uso del paquete Tibble

Concepto de tibble

tibble es una reinterpretación moderna de lo que es un dataframe, al igual que todas las funciones de tidyverse es más exigente con el código que rbase. Otra diferencia notable es que tibble presenta un formato mucho más consistente que un dataframe de rbase.

Un dataframe se puede devolver en forma de un vector o de otro dataframe (lo cual hace que sea inconsistente). Mientras que un tibble siempre se devuelve en el código en forma de tibble.

Ejemplo:

Podemos guardar un columna de un dataframe en forma de un vector:

v1 <-  co_data [,1]
class(v1)# vemos que es un vector
FALSE [1] "tbl_df"     "tbl"        "data.frame"

Posteriomente podemos pasar este vector a dataframe:

v1 <- as.dataframe (co_data [,1])
FALSE Error in as.dataframe(co_data[, 1]): could not find function "as.dataframe"
class(v1)# vemos que es un dataframe 
FALSE [1] "tbl_df"     "tbl"        "data.frame"

Ejemplo de la creación de un tibble:

Para su creación usamos la función tibble:

t1 <- tibble (
  x = 1,
  y = 1
  )

E. Uso de tidyr: datos tidy o tidy data

Características de los datos tipo tidy

Cualquier dato tipo tidy debe cumplir:

  1. Cada columna es una sola variable
  2. Cada fila es una observación
  3. Cada celda es una única medida

Como podemos apreciar el formato tidy de los datos ayuda a simplificar y a ordenar nuestros datos de trabajo, es un paso esencial cuando se trabaja con grandes bases de datos. Este formato de los datos nos ayuda a trabajar de forma más eficiente, limpia y reproducible con nuestros datos.

Así el paquete tidyr de tidyverse compila una serie de funciones que nos permiten organizar y limpiar nuestros datos para que adquieran un formato tidy.

¿Está nuestro dataframe co_data en formato tidy?

Para saberlo haremos una exploración de este datafram y usaremos la función glimpse:

glimpse (co_data)
FALSE Rows: 1,036
FALSE Columns: 52
FALSE $ Sector       <chr> "Buildings", "Buildings", "Buildings", "Buildings", "Buil~
FALSE $ country_name <chr> "Afghanistan", "Albania", "Algeria", "Angola", "Anguilla"~
FALSE $ `1970`       <chr> "0.58", "0.99", "1.81", "0.12", "0.00", "0.06", "13.19", ~
FALSE $ `1971`       <chr> "0.58", "0.99", "1.81", "0.12", "0.00", "0.06", "13.19", ~
FALSE $ `1972`       <chr> "0.46", "1.10", "2.11", "0.14", "0.00", "0.08", "12.53", ~
FALSE $ `1973`       <chr> "0.57", "1.30", "2.51", "0.14", "0.00", "0.08", "15.03", ~
FALSE $ `1974`       <chr> "0.77", "1.41", "2.68", "0.13", "0.00", "0.06", "15.48", ~
FALSE $ `1975`       <chr> "0.59", "1.75", "2.97", "0.12", "0.00", "0.08", "16.22", ~
FALSE $ `1976`       <chr> "0.48", "1.91", "3.79", "0.09", "0.00", "0.06", "17.57", ~
FALSE $ `1977`       <chr> "0.43", "2.02", "3.80", "0.10", "0.00", "0.07", "18.60", ~
FALSE $ `1978`       <chr> "0.41", "2.21", "4.46", "0.33", "0.00", "0.06", "18.27", ~
FALSE $ `1979`       <chr> "0.48", "2.69", "5.16", "0.56", "0.00", "0.06", "18.80", ~
FALSE $ `1980`       <chr> "0.45", "1.73", "5.37", "0.70", "0.00", "0.06", "18.40", ~
FALSE $ `1981`       <chr> "0.52", "1.81", "5.84", "0.66", "0.00", "0.06", "19.40", ~
FALSE $ `1982`       <chr> "0.60", "1.90", "6.24", "0.38", "0.00", "0.07", "18.64", ~
FALSE $ `1983`       <chr> "0.94", "2.01", "7.04", "0.50", "0.00", "0.04", "20.14", ~
FALSE $ `1984`       <chr> "0.99", "2.06", "7.76", "0.55", "0.00", "0.06", "20.54", ~
FALSE $ `1985`       <chr> "1.28", "2.09", "4.87", "0.60", "0.00", "0.06", "20.83", ~
FALSE $ `1986`       <chr> "1.20", "2.20", "5.60", "0.62", "0.00", "0.07", "20.21", ~
FALSE $ `1987`       <chr> "0.79", "2.20", "6.01", "0.63", "0.00", "0.08", "21.72", ~
FALSE $ `1988`       <chr> "0.85", "2.33", "6.03", "0.75", "0.00", "0.08", "22.63", ~
FALSE $ `1989`       <chr> "0.98", "1.53", "6.76", "0.73", "0.00", "0.09", "21.19", ~
FALSE $ `1990`       <chr> "1.04", "2.09", "6.59", "0.66", "0.00", "0.09", "22.01", ~
FALSE $ `1991`       <chr> "0.99", "1.32", "7.54", "0.69", "0.00", "0.09", "22.12", ~
FALSE $ `1992`       <chr> "0.69", "0.57", "7.78", "0.62", "0.00", "0.08", "22.23", ~
FALSE $ `1993`       <chr> "0.60", "0.39", "8.23", "0.51", "0.00", "0.07", "22.98", ~
FALSE $ `1994`       <chr> "0.63", "0.33", "8.17", "0.63", "0.00", "0.08", "24.08", ~
FALSE $ `1995`       <chr> "0.36", "0.33", "8.09", "0.67", "0.00", "0.08", "24.72", ~
FALSE $ `1996`       <chr> "0.33", "0.45", "8.31", "0.91", "0.00", "0.08", "25.29", ~
FALSE $ `1997`       <chr> "0.36", "0.38", "7.98", "0.91", "0.00", "0.08", "24.76", ~
FALSE $ `1998`       <chr> "0.29", "0.29", "8.63", "1.01", "0.00", "0.04", "24.79", ~
FALSE $ `1999`       <chr> "0.29", "0.75", "9.09", "1.26", "0.00", "0.06", "26.32", ~
FALSE $ `2000`       <chr> "0.21", "0.76", "9.33", "1.05", "0.00", "0.05", "27.00", ~
FALSE $ `2001`       <chr> "0.12", "0.80", "9.53", "1.17", "0.00", "0.04", "25.70", ~
FALSE $ `2002`       <chr> "0.05", "1.17", "9.89", "1.20", "0.00", "0.05", "24.73", ~
FALSE $ `2003`       <chr> "0.03", "1.04", "10.68", "1.26", "0.00", "0.05", "26.97",~
FALSE $ `2004`       <chr> "0.04", "0.88", "11.51", "1.30", "0.00", "0.04", "29.54",~
FALSE $ `2005`       <chr> "0.08", "0.70", "12.50", "1.00", "0.00", "0.04", "31.25",~
FALSE $ `2006`       <chr> "0.11", "0.93", "12.19", "1.96", "0.00", "0.04", "32.83",~
FALSE $ `2007`       <chr> "0.16", "0.72", "13.60", "2.33", "0.00", "0.04", "33.16",~
FALSE $ `2008`       <chr> "0.32", "0.65", "13.57", "2.97", "0.00", "0.03", "37.37",~
FALSE $ `2009`       <chr> "0.47", "0.55", "17.40", "3.51", "0.00", "0.04", "36.48",~
FALSE $ `2010`       <chr> "0.65", "0.56", "16.80", "3.77", "0.00", "0.05", "36.48",~
FALSE $ `2011`       <chr> "0.75", "0.56", "18.57", "4.15", "0.00", "0.04", "33.71",~
FALSE $ `2012`       <chr> "0.75", "0.49", "20.33", "4.61", "0.00", "0.06", "35.48",~
FALSE $ `2013`       <chr> "0.92", "0.56", "22.60", "5.69", "0.00", "0.10", "37.59",~
FALSE $ `2014`       <chr> "0.85", "0.62", "21.57", "5.61", "0.00", "0.07", "38.62",~
FALSE $ `2015`       <chr> "0.86", "0.63", "23.51", "5.06", "0.00", "0.08", "39.36",~
FALSE $ `2016`       <chr> "0.80", "0.62", "23.19", "5.03", "0.00", "0.08", "39.71",~
FALSE $ `2017`       <chr> "0.84", "0.70", "23.91", "4.14", "0.00", "0.06", "38.31",~
FALSE $ `2018`       <chr> "0.86781928", "0.70320991", "25.8825776", "4.191584", "1.~
FALSE $ `2019`       <chr> "0.89489653", "0.71658967", "27.0897153", "4.2916661", "1~

Como se puede apreciar, nuestro dataframe co_data no cumple las características para ser un dato tipo tidy, ya que en el encontramos variables innecesarias que se pueden simplificar, por ejemplo los datos de año esta dispuestos como una variable cada uno, cuando se podría generar una sola variable llamada año que recogiese todos los años muestreados y los relacionase con los valores de CO2.

El formato en el que se encuentra actualmente estos datos se conoce como un formato ancho, donde existen muchas variables. Por ello, para que sea un dato tidy debemos pasarlo a un formato largo, donde existen menos variables.

En el formato largo haremos que solo existan 3 variables: - una para los niveles de CO2 - otra para los años - una final para los países

Para conseguir pasar de un formato ancho a un formato largo debemos utilizar la función pivot_longer ( dentro de pivot existen principalmente dos funciones pivot_longer que pasa a un formato largo y pivot_wider que pasa a un formato ancho).

co_data2 <-  co_data %>%
  pivot_longer(
    cols = "1970":"2019",# señalamos el rango de columnas que vamos a cambiar
    names_to = "co_year", # a donde va a ir esas columnas (la nueva variable)
    values_to = "co_value"# a donde van los valores de esas columnas de cada año (a donde van los datos de CO2 por año)
    )
Inciso sobre la pipa ( %>% o |:>)

La pipa coge un resultado previo y lo pasa a la siguiente función (concatena funciones). Ya existía en otros lenguajes de programación. En R apareció de repente en 2014, debido a que su uso facilita la lectura y escritura de código de forma considerable. Su shortcut es: ctrl + shift + m

F. Uso de dplyr: manipulación de datos

Mediante el uso de dplyr seguiremos trabajando los datos a través de diferentes funciones.

Filter y select

filter permite seleccionar filas, mientras que select permite seleccionar columnas.

Datos de CO2:

Una vez que hemos pasado los datos de CO2 a formato tidy vamos a visualizarlos con glimpse

glimpse (co_data2)
FALSE Rows: 51,800
FALSE Columns: 4
FALSE $ Sector       <chr> "Buildings", "Buildings", "Buildings", "Buildings", "Buil~
FALSE $ country_name <chr> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan~
FALSE $ co_year      <chr> "1970", "1971", "1972", "1973", "1974", "1975", "1976", "~
FALSE $ co_value     <chr> "0.58", "0.58", "0.46", "0.57", "0.77", "0.59", "0.48", "~

Pero al observar los datos vmos que tenemos información de todos los países, a nosotros solo nos interesa España para nuestro problema ambiental, por lo que usaremos filter para seleccionar aquellos datos que sean de España y lo guardaremos:

co_data_s <- co_data2 %>% 
  filter(country_name == "Spain and Andorra")

Datos de temperatura:

Ahora trabajaremos con los datos de temperatura, para ello primero comprobamos la estructura de los datos con str:

str(temp)
FALSE spec_tbl_df [25,933 x 6] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
FALSE  $ ID_coords: num [1:25933] 1 1 1 1 1 1 1 1 1 1 ...
FALSE  $ lon      : num [1:25933] -3.35 -3.35 -3.35 -3.35 -3.35 -3.35 -3.35 -3.35 -3.35 -3.35 ...
FALSE  $ lat      : num [1:25933] 40.5 40.5 40.5 40.5 40.5 ...
FALSE  $ date     : Date[1:25933], format: "1950-01-01" "1950-01-02" ...
FALSE  $ Tmin     : num [1:25933] 4.38 1.02 0.39 2.17 1.08 -0.88 0.11 2.78 4.66 3.56 ...
FALSE  $ Tmax     : num [1:25933] 9.67 10.59 11.38 14.73 13.11 ...
FALSE  - attr(*, "spec")=
FALSE   .. cols(
FALSE   ..   ID_coords = col_double(),
FALSE   ..   lon = col_double(),
FALSE   ..   lat = col_double(),
FALSE   ..   date = col_date(format = ""),
FALSE   ..   Tmin = col_double(),
FALSE   ..   Tmax = col_double()
FALSE   .. )
FALSE  - attr(*, "problems")=<externalptr>

Puede que lo de temperatura no este en formato tidy, pero lo dejamos así porque vamos a usar la temperatura media. La columna de id no es necesaria porque todos los datos son de Alcalá de Henares, por lo que vamos a eliminarla. Para quitar columnas en tidyverse no se borran columnas, sino que se seleccionan las columnas que quieres utilizando la función select.

temp_sel <- temp %>% 
  dplyr::select(!ID_coords) # podríamos hacerlo con - pero lo correcto es !, estamos seleccionando
                     # todas menos la columna del id
Mutate

Como hemos mencionado anteriormente lo que queremos es utilizar es la temperatura media de Alcalá de Henares, para ello vamos a generar una nueva variable en la que se refleje la temperatura media, que se calculará como la suma de las temperaturas máximas y mínimas entre 2. Además tengo otro inconveniente con respecto a la temperatura y es que en el apartado de fecha me aparecen los días, meses y años, pero solo nos interesan los años, ya que agruparemos la temperatura en función de estos. Para realizar todos estos cambios usaremos la función mutate:

temp_f <- temp_sel %>% 
  mutate(
    Tmean = (Tmax+Tmin)/2, 
    date = as.Date(date),
    month = format(date, format = "%m"),
    year = format(date, format = "%Y")
  )

En la primera parte del código estamos definiendo la nueva variable de temperatura media (Tmean) para ello, primero ponemos el nombre de la nueva variable y luego que datos o valores contiene, en este caso definimos que queremos que se calcule apartir de la media entre la temperatura máxima y mínima. En cuanto a la fecha le indica que nos extraiga los meses y días con “%m” y “%Y”, redefiniendo la variable en el proceso.

Con la función mutate podemos generar nuevas variables desde 0, indicando todos los valores de esa nueva variable.

Group_by y summarise

A pesar de todo el trabajo que llevamos hasta ahora todavía no hemos terminado de preparar los datos de temperatura ya que necesitamos que los datos de temperatura media este organizados por año, pues para un mismo año tenemos diferentes valores de temperatura media. Para conseguir esto utilizaremos las funciones group_by y summarise.

En primer lugar agruparemos los valores de temperatura media por año utilizando la función group_by. Pero tras esta operación sequiré teniendo varios datos de temperatura media por año, por ello lo que haremos será resumir estos datos haciendo la media de las temperaturas medias para cada año, esto lo conseguiremos utilizando la función summarise. Así aplicaremos el siguiente código:

temp_mean <- temp_f %>% 
  group_by(year) %>% 
  summarise(
    Tmean.year = mean(Tmean)
  )
Join

Como para nuestro problema ambiental queremos tener los datos de CO2 y los de temperatura en un mismo tibble utilizaremos la función join que me permite unir las columnas varios dataframes o varios tibbles en uno solo por diversos métodos, donde se selecciona la variable común por la que se quieren unir. Existen principalmente cuatro tipos de join:

  • full_join: consiste en unir todas las columnas de los dataframes o tibbles en uno solo
  • left_join: toma todas las columnas del primer dataframe o tibble y las unirá solo con las columnas que tengan filas coincidentes del segundo dataframe o tibble
  • right_join: toma todas las columnas del segundo dataframe o tibble y las unirá solo con las columnas del primer dataframe o tibble que tengan filas que coincidan en ambos
  • inner_join: que solo unirá las columnas de los dos dataframes o tibbles que tengan filas coincidentes.

Estos concepto se entienden mejor con la siguiente imagen:

Utilizaremos un full_join para unir los datos de CO2 y de temperatura por el año:

co_temp <- full_join( 
  temp_mean, 
  co_data_s, 
  by = c("year" = "co_year")
  )

En este código hemos dicho que la columna “year” de temperatura es igual que la columna ” co_year” de los datos de CO2, y hemos unido las dos bases por medio de esta columna. Ahora que se han unido nos queda organizar un poco la información, si nos fijamos en nuestro nuevo tibble co_temp veremos que existen varios valores de temperatura repetidos por sectores donde se ha medido el nivel de CO2. Lo que sucede es que la temperatura anual media en Alcalá de Henares es igual para cualquiera de los sectores pero no lo son los niveles de CO2 emitidos, por lo que para los datos de CO2debemos realizar la suma de los niveles de dióxido de carbono por sector,por ello usaremos la función summarise. Mientras que en el caso de la temperatura debemos eliminar los valores repetidos, por ello nos quedaremos con los primeros valores de temperatura que aparecen por año utilizando la función first. Estas funciones las aplicaremos de forma simultánea, pero hay un inconveniente y es que no se puede realizar la suma de los niveles de CO2 por sector tal cual debido a que esta variable está definida como un factor, por ello, antes de nada utilizaremos mutate para transformarla en numérica.

co_temp_all <- co_temp %>%
  mutate( co_value = as.numeric(co_value),
          year = as.numeric(year) ) %>% # empleamos mutate pasando co_value year a una variable numérica
  
  group_by(year) %>% 
  summarise(co_all =sum(co_value), Tmean.year= first(Tmean.year) )# realizamos la suma de los niveles de CO2 y tomamos los primeros valores de temperatura por año

G. Visualización de los resultados con ggplot

Ahora que ya hemos terminado de organizar y depurar la información solo nos queda visualizar los resultados, aquí es donde entra el paquete ggplot, que permite producir diferentes tipos de gráficos de forma relativamente sencilla. Debido a que este paquete es anterior al resto de paquetes de tidyverse no funciona con la pipa ( %>% ), sino que emplea el símbolo “+”.

Más adelante, en el apartado de visualización de datos detallaremos más a fondo el funcionamiento y sintaxis de ggplot, por lo que en este apartado solo veremos unas nociones básicas de su funcionamiento.

Haremos una nube de puntos sobre los datos de la temperatura media anual.

Para ello, primero llamamos a ggplot, definimos la base de datos que vamos a usar y definimos cuales son la variable x e y (aes hace referencia a aesthetics y sirve para indicar dentro de…), luego indicamos que tipo de representación queremos realizar.

ggplot(co_temp, aes(x = year, y = Tmean.year))+
  geom_point()
FALSE Error : The fig.showtext code chunk option must be TRUE

Al observar la nube de puntos generada vemos que algunos puntos (que son las observaciones) se solapan, esto se debe a que estamos utilizando la base de datos antigua donde hay datos de temperatura repetidos por año, simplemente debemos usar la base de datos más reciente donde habíamos realizado un summarise.

ggplot(co_temp_all, aes(x = year, y = Tmean.year)) +
  geom_point()
FALSE Error : The fig.showtext code chunk option must be TRUE

H. Paquete stringr

Este paquete de tidyverse contiene funciones que facilitan el trabajo con string.

Los string son vectores compuestos por palabras. Este tipo de vectores se emplean en e minado de texto, donde extraemos datos de forma automatizada de documentos.

Ejemplo:

co_temp_s <- co_temp %>%
  mutate( other = str_detect(Sector, "Other") )

# Aquí hemos utilizado una función del paquete `stringr` para que genere una nueva variable llamada `other` donde se determina si pertenecen a datos de un sector que lleve la palabra "other" (TRUE) o no (FALSE).

I. Uso del paquete forcats

Este paquete compila una serie de funciones que facilita el trabajo con factores. Todas las funciones de este paquete empiezan por la partícula “fct”. Existen funciones como relevel que reordena los vectores según un orden definido.

Ejemplo:

co_temp_fs <- co_temp %>% 
  mutate(
    Sector = fct_relevel(Sector, "Other industrial combustion", after = Inf),
    Sector = fct_relevel(Sector, "Other sectors", after = Inf)
    )

# Aquí hemos utilizado la función fct_relevel para reorganizar los datos de forma que aquellas filas donde el sector sea "Other industrial combustion" y donde el sector sea "Other sectors" salgan como último y penúltimo respectivamente por año.

J. Uso del paquete purrr

Con las funciones del paquete de purrr puedo conseguir crear funciones en bucle y de forma automatizada, por ejemplo podemos aplicar funciones de purrr, para que apliquen un determinado tema a las figuras y gráficos de ggplot y hacer que se ejecute en bucle sobre los elementos de una lista. Con respecto a la sintaxis, la mayoría de funciones de purrr suelen contener la partícula “map”

Ejemplo:

En rbase podríamos generar la siguiente función:

select_julen <-  function (df, x) # aquí df y x son argumentos
  {df[,x]}

Con purrr podríamos generar la misma función y aplicarla en bucle.

4.2. Representación gráfica con ggplot

En este apartado nos centraremos en la generación de diferentes tipos de gráficos con ggplot

4.2.1. Tipos de gráficos

Los gráficos pueden ser:

  • Histogramas: permite visualizar los datos, nos puede indicar la distribución de los datos, el eje de la Y es count (cuenta/ cantidad). X es una variable continua.

  • Barplots (gráfico de barras): aquí la variable X puede ser discreta y la variable Y no es un count

  • Scatterplots (nubes de puntos): la línea de tendencia se conoce como smooth

  • Boxplot (caja de bigotes): es un gráfico de dispersión y nos permite de saber como de alejados están los datos, la linea del medio es la mediana

4.2.2. Sintaxis de ggplot

A. Librerías y datos a utilizar, observación de los datos

Para trabajar con ggplot, además de necesitar el paquete de tidyverse, utilizaremos otros paquetes que nos permitirán personalizar los gráficos. Por ello, cargamos las siguientes librerías:

library(tidyverse)
library(lubridate)
FALSE 
FALSE Attaching package: 'lubridate'
FALSE The following objects are masked from 'package:raster':
FALSE 
FALSE     intersect, union
FALSE The following objects are masked from 'package:base':
FALSE 
FALSE     date, intersect, setdiff, union
library(ggthemes)
library(wesanderson)

También vamos a cargar los datos con los que vamos a trabajar, en estos datos se recoge información sobre los seismos y niveles de SO2 por región sobre la erupción de la Palma que ha sucedido este mismo año, en el primer dataframe. En el segundo dataframe se recoge información más detallada sobre los seísmos (como la profundidad o magnitud de estos), además de otra información como la temperatura.

count_cumbre_vieja <- read_csv("cumbre_vieja_visualdata-main/count_cumbre_vieja.csv")
FALSE Rows: 117 Columns: 4
FALSE -- Column specification --------------------------------------------------------
FALSE Delimiter: ","
FALSE chr  (1): Region
FALSE dbl  (2): number, so2
FALSE date (1): date
FALSE 
FALSE i Use `spec()` to retrieve the full column specification for this data.
FALSE i Specify the column types or set `show_col_types = FALSE` to quiet this message.
data_cumbre_vieja <- read_csv("cumbre_vieja_visualdata-main/data_cumbre_vieja.csv")
FALSE Rows: 332 Columns: 19
FALSE -- Column specification --------------------------------------------------------
FALSE Delimiter: ","
FALSE chr   (2): Max. int, Region
FALSE dbl  (16): Latitude, Longitude, Depth, Magnitude, day, pm1, pm10, pm25, temp...
FALSE date  (1): date
FALSE 
FALSE i Use `spec()` to retrieve the full column specification for this data.
FALSE i Specify the column types or set `show_col_types = FALSE` to quiet this message.

De momento trabajaremos con el primer dataframe, count_cumbre_vieja.

Antes de comenzar a visualizar los datos en forma de gráficos debemos observar el dataframe, para ello podemos utilizar por ejemplo, la función View:

View(count_cumbre_vieja)

Vemos que tenemos cuatro variables:

  • Fecha en la que se produjeron los seísmos

  • La región de la Palma donde se registraron

  • El número de terremotos

  • Los niveles de SO2

Con respecto al dataframe de count_cumbre_vieja podemos plantearnos ver las siguientes relaciones entre las variables, entre otras:

  • Número de terremotos ~ Niveles de SO2

  • Número de terremotos ~ Región

  • Número de terremotos ~ Fecha

  • Niveles de SO2 ~Fecha

B. Sintaxis de ggplot

ggplot tiene 4 elementos principales:

  • La función de ggplot

  • Los datos a utilizar

  • Las variables definidas, donde empleamos aes

  • El tipo de gráfico que queremos realizar y que sique la forma geom_tipo

Un esquema general de la estructura de un gráfico ggplot sería el siguiente:

ggplot(datos, aes(var_x, var_y)+
       geom_tipodegrafico (loquequeremos,# donde his_hitograma,point_nube de puntos
                           alpha= gradodetransparencia,
                           size= tamañodelpunto,
                           color= color,
                           fill= fondo))
FALSE Error in geom_tipodegrafico(loquequeremos, alpha = gradodetransparencia, : could not find function "geom_tipodegrafico"

Donde geom_smooth es la línea de tendencia de una nube de puntos y puede seguir diferentes modelos que detallaremos más adelante

C. Nubes de puntos

Relación número de terremotos ~ fecha
terremoto <- ggplot(data= count_cumbre_vieja,
                    aes(x=date, y= number))+
  geom_point(color= "indianred",
             size= 5,
             alpha= 0.5)+
  geom_smooth(color= "skyblue",
              fill= "steelblue",
              method= "lm")+
  labs(x= "fecha",
       y= "Número de terremotos",
       title= "Erupción la Palma",
       subtitle = "2021")+
  theme_classic() 

terremoto
FALSE Error : The fig.showtext code chunk option must be TRUE
FALSE `geom_smooth()` using formula 'y ~ x'

Donde:

  • method: permite definir el tipo de método por el que se obtiene la línea de tendencia el tipo de método se ponemos entre comillas. El método a usar depende de lo que queremos, aquí es mejor utilizar el método default (que es el método “loess”), pero por probar utilizamos “lm”, es decir, linear model.

  • labs: indica las etiquetas, puede ser títulos y subtítulos o nombres de los ejes, se debe poner entre comillas ya que sino R lo considera un objeto.

  • theme: permite definir el aspecto del gráfico, lo mejor es dejarlo para el final.

Probamos ahora con el método “loess”

ggplot(data= count_cumbre_vieja, 
       aes(x=date, y= number))+
  geom_line(linetype= "dashed", 
            color= "steelblue")+
  geom_point(color= "skyblue", 
             size= 5,
             alpha= 0.5)+
  labs(x= "fecha",
       y= "Número de terremotos",
       title= "Erupción la Palma",
       subtitle = "2021")+
  theme_classic() 
FALSE Error : The fig.showtext code chunk option must be TRUE

Como vemos, para este caso es mejor usar el método “loess” ya que nos permite ver la gran variación del número de terremotos por fecha, mientras que el método “lm” no nos aporta nada de información. También existe un method que es el modelo aditivo (“gam”).

Como podemos apreciar en ggplot se pueden agregar figuras sobre figuras al hacer varios geom consecutivos, esto facilita mucho la generación de gráficos y simplifica el código.

Podemos incluso guardar un gráfico como un objeto y posteriomente añadirle más elementos, por ejemplo:

terremoto2 <- terremoto +
  geom_line(linetype= "dashed",
            color= "darkblue") 
terremoto2
FALSE Error : The fig.showtext code chunk option must be TRUE
FALSE `geom_smooth()` using formula 'y ~ x'

Diferenciación por regiones

Dentro de un mismo gráfico podemos incluir información de una tercera variable, en nuestro caso donde vemos la relación entre el número de seísmos y la fecha, podemos realizar una diferenciación por regiones de estos datos.

Para conseguir esta diferenciación hay dos estrategias:

  • Generar una diferenciación por color, donde se genere un código de color que nos permita diferenciar los datos por regiones ( es decir, darle un color distinto a cada región).

  • Separar los datos en diferentes gráficos (donde existirá un gráfico para cada región).

Diferenciación por color

Para ello basta con indicar en geom_point que queremos colorear por región:

terre_region <- ggplot(data= count_cumbre_vieja,
                       aes(x=date, y= number))+
  geom_point(aes(color= Region), 
             size= 2,
             alpha= 0.5)+
  labs(x= "fecha", 
       y= "Número de terremotos",
       title= "Erupción la Palma", 
       subtitle = "2021")+
  theme_classic()

terre_region
FALSE Error : The fig.showtext code chunk option must be TRUE

Podemos también generar la líneas de tendencia por regiones y personalizar más el gráfico.

terre_region2 <- ggplot(data= count_cumbre_vieja,
                        aes(x=date, y= number))+
  geom_point(aes(color= Region), 
             size= 2,
             alpha= 0.5)+
  geom_smooth(aes(color= Region,
                  fill= Region)
  )+ 
  labs(x= "fecha", y= "Número de terremotos",
       title= "Erupción la Palma", subtitle = "2021")+ 
  theme_classic()
terre_region2
FALSE Error : The fig.showtext code chunk option must be TRUE
FALSE `geom_smooth()` using method = 'loess' and formula 'y ~ x'

Si nos fijamos en este segundo gráfico vemos que nos faltan las líneas de tendencia de dos regiones, esto se debe a que solo hay una observación para esas regiones y con un punto no se puede generar una línea. Si nos damos cuenta podemos observar que el color usado en el fill no coincide con el de las líneas de tendencia, esto se debe a que la paleta de colores que usa ggplot usa los colores en orden, y al no poder representar dos regiones los colores de esas regiones se usan en las demás.

El color se puede definir manualmente para evitar estos pequeños errores.

En este caso al solo tener dos regiones con línea de tendencia lo mejor es separar los datos en varias gráficas independientes.

¿Por qué usar color o fill? : color se utiliza para colorear contornos, líneas y puntos (elementos de una dimensión), mientras que fill se emplea para colorear áreas.

Generación de diferentes gráficos por regiones

Para ello usamos la función facet_wrap:

terre_region3 <- terre_region2 +
  facet_wrap(.~Region)

terre_region3
FALSE Error : The fig.showtext code chunk option must be TRUE
FALSE `geom_smooth()` using method = 'loess' and formula 'y ~ x'

Aquí no hay que poner aes, ya que aes se pone con los geom. Podemos poner el área de tendencia de un color solo o en gris (en gris es por defecto y para ello bastaría con quitar el fill).

Como consejo para cualquier estudio, cuando hagamos un scatterplot lo mejor es utilizar un linear model (“lm”) al principio, para ver si se ajusta a un modelo lineal, si vemos que el ajuste no es bueno podemos probar con otros métodos.

Relación número de terremotos ~ niveles de SO2
terre_so2 <- ggplot(data= count_cumbre_vieja,
                    aes(x=number,
                        y= so2))+
  geom_point(color= "coral1",
             size= 2, 
             alpha= 0.5)+
  geom_smooth(method="lm")+
  theme_classic()

terre_so2
FALSE Error : The fig.showtext code chunk option must be TRUE
FALSE `geom_smooth()` using formula 'y ~ x'

Podemos apreciar que no se ajusta bien a un modelo lineal.

Trabajo con data_cumbre_vieja, relación fecha ~ magnitud de terremotos

Ahora comenzamos a trabajar con el segundo dataframe y vamos a ver la relación entre la fecha y la magnitud de los terremotos.

ggplot(data=data_cumbre_vieja,
       aes(x= date, 
           y= Magnitude))+
  geom_point(aes(size= Magnitude),
             alpha= 0.25)+
  geom_smooth()
FALSE Error : The fig.showtext code chunk option must be TRUE
FALSE `geom_smooth()` using method = 'loess' and formula 'y ~ x'

Aquí hemos representamos la relación entre la fecha de los terremotos y la magnitud de estos, hemos definido que le tamaño de los puntos varíe en función de la magnitud de los terremotos para que la visualización resulte más sencilla. Aunque esta diferenciación sería más correcta hacerla si la magnitud no estuviese ya representada en el gráfico, porque da información redundante.

Podemos realizar la diferenciación del tamaño de los puntos en función de la profundidad de los seísmos, donde a menor profundidad más grandes srán los puntos, debido a que al ser más superficiales se sienten más fácilmente por la población. A este respecto nos surge un inconveniente, y es que R por si solo hará más grande los puntos con mayor valor de profundidad, para cambiar esto basta con invertir el valor de la profundidad en el código al poner un “-” delante. El cambiar el tamaño para facilitar la visualización es mejor utilizarlo con variables continuas, con variables categóricas seria mejor realizar una diferenciación con colores o facets.

mag_pro <- ggplot(data=data_cumbre_vieja,
                  aes(x= date, 
                      y= Magnitude))+
  geom_point(aes(size= -Depth, color= -Depth),
             alpha= 0.25)+
  geom_smooth()+
  scale_color_gradientn(colors = rev(wes_palette("Zissou1",)))+
  theme_classic()

mag_pro
FALSE Error : The fig.showtext code chunk option must be TRUE
FALSE `geom_smooth()` using method = 'loess' and formula 'y ~ x'

Hemos invertido la escala de colores para que vaya acorde con la profundidad y que refleje la intensidad con la que sentiríamos los seísmos

D. Boxplots

Los boxplots se componen de una sola variable y pueden representarse varios en base a otra variable categórica, nos permiten ver la dispersión de los datos.

Magnitud

Por defecto los boxplots se orientan según el eje y, hemos realizado un bosxplot sobre la magnitud de los terremotos.

ggplot(data=data_cumbre_vieja,
       aes(y= Magnitude))+
  geom_boxplot()
FALSE Error : The fig.showtext code chunk option must be TRUE

Podemos ver que sucede si realizamos una diferenciación por regiones:

ggplot(data=data_cumbre_vieja,
       aes(y= Magnitude, x= Region))+
  geom_boxplot(color= "black",
               aes(fill= Region))+
  theme_light()+
  theme(legend.position= "none")
FALSE Error : The fig.showtext code chunk option must be TRUE

Hemos quitado la leyenda porque los nombres de las regiones ya aparecen. La región de Tazacorte se representa con una única línea debido a que solo tiene una observación. Las personalizaciones del tema (como la posición de la leyenda, por ejemplo) van lo último porque sino se solapan con el tema y da fallos, por ejemplo si lo de la leyenda no fuese lo último, me aparecería porque forma parte del tema que hemos usado.

E. Barplots o gráficos de barras

Vamos a relacionar por medio de un barplot el número de terremotos con la región. Si hacemos el barplot tal cual nos dará un error, diciéndonos que solo podemos utilizar una variable, para solucionar este fallo basta con usar el parche stat= "identity". Para diferenciar las regiones colorearemos de forma diferencial el barplot según la región (usamos la función fill porque estamos coloreando un área).

ggplot(data= count_cumbre_vieja,
       aes(x= Region,
           y= number))+
  geom_bar(stat = "identity",
           aes(fill= Region))
FALSE Error : The fig.showtext code chunk option must be TRUE

Para que fuese estadísticamente correcto habría que poner barras de error en el gráfico.

F. Histogramas

Un histograma nos indica la frecuencia con la que se repite un dato y además, nos permite ver la distribución de datos.

Vamos a realizar un histograma sobre la magnitud de los terremotos.

his_1 <- ggplot(data= data_cumbre_vieja,
                aes(x = Magnitude))+
  geom_histogram(fill = "forestgreen",
                 bins = 200,
                 binwidth = 0.1)+
  theme_clean()+
  labs(y = "Frecuencia", 
       x = "Magnitud", 
       title = "Histograma 1")
his_1
FALSE Error : The fig.showtext code chunk option must be TRUE

Donde bins es el numero de barras del gráfico y binwidth permite ajustar el grosor de las barras.

G. Diagramas de densidad

Por último podemos realizar diagramas de densidad para ver también la distribución de los datos, vamos a realizar un diagrama de densidad con la magnitud.

den_1 <- ggplot(data= data_cumbre_vieja,
                aes(x = Magnitude))+
  geom_density(fill = "#E88873", 
               color = "#E05C3E",
               alpha = 0.5)+
  theme_clean()
den_1
FALSE Error : The fig.showtext code chunk option must be TRUE

5. Visualización de datos, GIS y mapas

A lo largo de este bloque trabajaremos en la creación de mapas y en el uso de R como GIS

5.1. R como GIS

5.1.1. ¿Qué son los sistemas GIS o SIG?

Los sistemas GIS o SIG son sistemas de información geográfica, es decir, son programas informáticos que nos permiten trabajar con datos geográficos y tienen muchísimas utilidades en una gran variedad de campos.

Estos integran información digital la analizan y la representan. Los sistemas GIS funcionan por capas, suelen ser mapas o atributos mapeables, hay distintos tipos de capas como poligonales, lineales, de puntos, etc. Todas las capas deben ser del mismo tipo.

En estos sistemas podemos distinguir entre dos tipos principales de datos:

  • Datos en formato raster (fotografía)

  • Datos en formato vectorial(esta información está codificado de diferente forma)

¿Cuál es mejor, raster o vectorial?

Al trabajar con raster vamos a tener problemas en función de la resolución de la imagen por lo que los datos de tipo vectorial son más fieles a la realidad. Por lo tanto, a este respecto es mejor utilizar datos de tipo vectorial, pero hay ocasiones donde nos es indiferente cuál usar.

Tipos de archivos que usan los datos vectoriales

El tipo de archivo que más se usan en capas vectoriales son los archivos shapefile (shp), estos se componen de cinco archivos:

  • Tabla df: se trata de una tabla asociada a los atributos que quiero representar con la capa vectorial

  • prj: la proyección geográfica

  • shp: listas anidadas

  • xml: metadatos

  • shx: escala rotación

Tipos de archivos que usan los datos raster

Como hemos mencionado anteriormente los archivos tipo raster son imágenes y en consecuencia trabajamos con archivos de extensiones tiff, jpeg, etc. Hay otros tipos de archivos raster que se denominan net cdf, y se emplean para datos climáticos.

Existen diferentes tipos de programas que funcionan como GIS, tenemos por ejemplo, QGIS, ArcGIS o esri.

Proyecciones y sistemas de coordenadas

Todos estos programas se basan en sistemas de coordenadas y proyecciones geográficas.

Una proyección geográfica consiste en transferir la esfera de la tierra a un plano. Hay diferentes tipos de proyecciones geográficas:

  • Cilíndrica, que es la proyección más habitual

  • Accital, que va desde los polos polos

  • Cónica, esta es útil cuando trabajamos a nivel local.

Con respecto a los sistemas de coordenadas geográficas, estos se componen de latitud (norte-sur) y longitud (este-oeste), y todos estos van de - 180º a +180º. Existen muchos sistemas diferentes, uno de los más usados es el sistema UTM. En el sistema UTM se divide la superficie terrestre en cuadrículas de un determinado tamaño que siempre son iguales, se utiliza este sistema cuando área tiene importancia.

5.1.2. Utilización de R como GIS

En este apartado veremos un ejemplo de como podemos utilizar R como GIS.

A. Preparación del entorno de trabajo

En primer lugar borramos el ambiente de trabajo:

rm(list=ls()) 

Definimos el directorio de trabajo:

setwd("C:/Users/tsuba/OneDrive/Escritorio/MANUAL")

Y a continuación cargamos las librerías que vamos a utilizar:

library(raster)
library(maptools)
FALSE Checking rgeos availability: TRUE
FALSE Please note that 'maptools' will be retired by the end of 2023,
FALSE plan transition at your earliest convenience;
FALSE some functionality will be moved to 'sp'.
library(sp)
library(sf)
FALSE Linking to GEOS 3.9.1, GDAL 3.2.1, PROJ 7.2.1; sf_use_s2() is TRUE
library(rgdal)
FALSE Please note that rgdal will be retired by the end of 2023,
FALSE plan transition to sf/stars/terra functions using GDAL and PROJ
FALSE at your earliest convenience.
FALSE 
FALSE rgdal: version: 1.5-29, (SVN revision 1165M)
FALSE Geospatial Data Abstraction Library extensions to R successfully loaded
FALSE Loaded GDAL runtime: GDAL 3.2.1, released 2020/12/29
FALSE Path to GDAL shared files: C:/Users/tsuba/OneDrive/Documentos/R/win-library/4.1/rgdal/gdal
FALSE GDAL binary built with GEOS: TRUE 
FALSE Loaded PROJ runtime: Rel. 7.2.1, January 1st, 2021, [PJ_VERSION: 721]
FALSE Path to PROJ shared files: C:/Users/tsuba/OneDrive/Documentos/R/win-library/4.1/rgdal/proj
FALSE PROJ CDN enabled: FALSE
FALSE Linking to sp version:1.4-6
FALSE To mute warnings of possible GDAL/OSR exportToProj4() degradation,
FALSE use options("rgdal_show_exportToProj4_warnings"="none") before loading sp or rgdal.
FALSE Overwritten PROJ_LIB was C:/Users/tsuba/OneDrive/Documentos/R/win-library/4.1/rgdal/proj
library(dismo)
library(spam)
FALSE Spam version 2.8-0 (2022-01-05) is loaded.
FALSE Type 'help( Spam)' or 'demo( spam)' for a short introduction 
FALSE and overview of this package.
FALSE Help for individual functions is also obtained by adding the
FALSE suffix '.spam' to the function name, e.g. 'help( chol.spam)'.
FALSE 
FALSE Attaching package: 'spam'
FALSE The following objects are masked from 'package:base':
FALSE 
FALSE     backsolve, forwardsolve
library(rworldmap)
FALSE ### Welcome to rworldmap ###
FALSE For a short introduction type :    vignette('rworldmap')
library(rworldxtra)
library(jsonlite)
FALSE 
FALSE Attaching package: 'jsonlite'
FALSE The following object is masked from 'package:purrr':
FALSE 
FALSE     flatten
library(rgeos)
FALSE rgeos version: 0.5-9, (SVN revision 684)
FALSE  GEOS runtime version: 3.9.1-CAPI-1.14.2 
FALSE  Please note that rgeos will be retired by the end of 2023,
FALSE plan transition to sf functions using GEOS at your earliest convenience.
FALSE  GEOS using OverlayNG
FALSE  Linking to sp version: 1.4-6 
FALSE  Polygon checking: TRUE
library(mapSpain)
library(ggmap)
FALSE Google's Terms of Service: https://cloud.google.com/maps-platform/terms/.
FALSE Please cite ggmap if you use it! See citation("ggmap") for details.
FALSE 
FALSE Attaching package: 'ggmap'
FALSE The following object is masked from 'package:dismo':
FALSE 
FALSE     geocode
library(ggplot2)
library(maps)
FALSE 
FALSE Attaching package: 'maps'
FALSE The following object is masked from 'package:viridis':
FALSE 
FALSE     unemp
FALSE The following object is masked from 'package:purrr':
FALSE 
FALSE     map
library(mapdata)
library(marmap)
FALSE Registered S3 methods overwritten by 'adehabitatMA':
FALSE   method                       from
FALSE   print.SpatialPixelsDataFrame sp  
FALSE   print.SpatialPixels          sp
FALSE 
FALSE Attaching package: 'marmap'
FALSE The following object is masked from 'package:raster':
FALSE 
FALSE     as.raster
FALSE The following object is masked from 'package:grDevices':
FALSE 
FALSE     as.raster
library(mapproj)
library(slippymath)
library(ggspatial)

B. Obtención de los datos de países para generar mapas

Utilizando el paquete mapSpain vamos a descargarnos datos geográficos del mundo en alta resolución, para poder representar después un mapa, sobre el cual iremos trabajando:

mapamundo <- getMap(resolution="high") 

A continuación vemos los datos que tenemos usando head:

head(mapamundo) 

Y lo visualizamos usando plot:

plot(mapamundo)
FALSE Warning in wkt(obj): CRS object has no comment
FALSE Error : The fig.showtext code chunk option must be TRUE

Como observamos en la imagen se trata de un mapa de todo el mundo, pero a nosotros nos interesa únicamente España, puesto que a los datos descargados podemos acceder como si se tratase de una tabla para quedarnos con España, basta con seleccionar la fila en la que se encuentre el valor de España:

mapaspain <- mapamundo["Spain",]

Podemos incluso seleccionar varios países, por ejemplo, vamos a seleccionar Italia y Francia:

mapaitaliafrancia <- mapamundo[c("Italy", "France"),]
plot(mapaitaliafrancia)
FALSE Warning in wkt(obj): CRS object has no comment
FALSE Error : The fig.showtext code chunk option must be TRUE

Visualizamos el mapa de España:

plot(mapaspain)
FALSE Warning in wkt(obj): CRS object has no comment
FALSE Error : The fig.showtext code chunk option must be TRUE

Como podemos apreciar en la imagen además de la península, nos muestra las Islas Baleares y Canarias. Vamos a recortar el mapa para descartar las Islas Canarias, y quedarnos únicamente con la península y las islas baleares. Para esto vamos a utilizar la función crop, en donde definiremos un extent con las coordenadas del área con el que te quieres quedar (un extent no es más que un rectángulo donde definimos las latitudes (valores de la x) y longitudes (valores de la y) mínimas y máximas, en este mismo orden, que definen el área del mapa que e interesa):

mapaspain <- crop(mapaspain,
                  extent(-10,
                         5,
                         35,
                         45)) 

Volvemos a visualizarlo:

plot(mapaspain)
FALSE Warning in wkt(obj): CRS object has no comment
FALSE Error : The fig.showtext code chunk option must be TRUE

Al igual que con cualquier otro plot podemos personalizar nuestro mapa, cambiando por ejemplo el color del polígono y su contorno:

plot(mapaspain,
     col="lightblue",
     border="white")
FALSE Warning in wkt(obj): CRS object has no comment
FALSE Error : The fig.showtext code chunk option must be TRUE

C. Otras formas de visualizar mapas con R

Utilizando el paquete maps, aproximaciones simples

Por medio del paquete maps podemos generar mapas algo más completos que los anteriores de forma relativamente sencilla.

Mapa sin fondo

Comenzamos abriendo una ventana para dibujar el mapa usando la función mapDevice, a continuación usamos la función mapy definimos varios elementos:

  • Definimos la zona del mundo de donde queremos que nos descargue el mapa, en nuestro caso descargaremos un mapa del mundo (escogemos la base de datos de donde se descargarán los datos geográficos)

  • Definimos el color de relleno del polígono

  • Definimos las coordenadas que queremos que se representen

  • Escogemos la proyección (en nuestro caso escogemos la proyección albers que es una proyección en metros), la resolución y el color del borde del polígono y su grosor

mapDevice() 
map("world",
    fill=TRUE,
    col="lightblue", 
    boundary=F,
    interior=F,
    ylim=c(-60, 65),
    mar=c(0,0,0,0),
    projection='albers',
    par=c(0,0),
    wrap=T,
    resolution=1,
    border="aliceblue",
    myborder=0)
FALSE Error : The fig.showtext code chunk option must be TRUE

Mapa con fondo

Podemos añadir un fondo por medio de la función bg, realizaremos un mapa de Europa y el Norte de África con fondo azul:

map("world", 
    fill=TRUE,
    col="#91849A",
    bg="#454973",
    boundary=F,
    interior=F,
    ylim=c(30, 65),
    xlim=c(-5,25), 
    mar=c(0,0,0,0),
    projection='albers',
    par=c(0,0),
    wrap=T,
    resolution=0,
    border="#D9BBF9",
    myborder=0)
FALSE Error : The fig.showtext code chunk option must be TRUE

Utilizando ggplot

Podemos utilizar el paquete maps y ggplot de forma conjunta para generar mapas más personalizados. Primero debemos generar un capa donde definamos los polígonos que queremos representar:

mapWorld <- borders("world",
                    colour="#999DC2",
                    fill="#575D90",
                    ylim=c(-60,60),
                    xlim=c(-180,180))
mapWorld
FALSE mapping: group = ~group, x = ~long, y = ~lat 
FALSE geom_polygon: na.rm = FALSE, rule = evenodd
FALSE stat_identity: na.rm = FALSE
FALSE position_identity

A continuación, sobreponemos al mapa anterior una capa de ggplot:

mp <- ggplot() +   mapWorld
mp
FALSE Error : The fig.showtext code chunk option must be TRUE

Personalizamos el tema de ggplot:

mp + theme(panel.border = element_blank(),
           panel.grid.major = element_blank(),
           panel.grid.minor = element_blank())
FALSE Error : The fig.showtext code chunk option must be TRUE

Utilizando el paquete rworldmap
# Primero debemos obtener un mapa, para ello usamos `getMap`:
trymap<-getMap() 

# En este mapa podemos generar "burbujas" a las que podemos asociar los datos que queramos:
mapBubbles(dF=trymap,
           colourPalette="rainbow",
           oceanCol="aliceblue",
           landCol="#999DC2",
           borderCol="#999DC2",
           ylim=c(-49.5,70),
           lwd=0.1,
           add = T)
FALSE Error in `[.data.frame`(dF, , nameZSize): undefined columns selected
# Y añadimos líneas de contorno:
maps::map("worldHires",
          add=T,
          col="#BFC1D9",
          lwd=1.5)
FALSE Error in plot.xy(xy.coords(x, y), type = type, ...): plot.new has not been called yet

D. Uso de shapefiles

Además de obtener los mapas desde R, podemos obtenerlos directamente desde páginas web y cargar los shapefiles en R. Hemos ido a la siguiente dirección web http://www.naturalearthdata.com/, y desde donde descargamos dos shapefiles:

  • En el apartado de cultural descargamos el archivo countries de admin0 en escala media

  • En el apartado de physical descargamos el archivo land

Comenzamos cargado los dos shapefiles gracias a la función st_read:

land <- st_read("DataScienceUAH-main/ne_50m_land.shp") 
FALSE Reading layer `ne_50m_land' from data source 
FALSE   `C:\Users\tsuba\OneDrive\Escritorio\MANUAL\DataScienceUAH-main\ne_50m_land.shp' 
FALSE   using driver `ESRI Shapefile'
FALSE Simple feature collection with 1420 features and 3 fields
FALSE Geometry type: MULTIPOLYGON
FALSE Dimension:     XY
FALSE Bounding box:  xmin: -180 ymin: -89.99893 xmax: 180 ymax: 83.59961
FALSE Geodetic CRS:  WGS 84
boundars <- st_read("DataScienceUAH-main/ne_50m_admin_0_countries.shp")
FALSE Reading layer `ne_50m_admin_0_countries' from data source 
FALSE   `C:\Users\tsuba\OneDrive\Escritorio\MANUAL\DataScienceUAH-main\ne_50m_admin_0_countries.shp' 
FALSE   using driver `ESRI Shapefile'
FALSE Simple feature collection with 242 features and 161 fields
FALSE Geometry type: MULTIPOLYGON
FALSE Dimension:     XY
FALSE Bounding box:  xmin: -180 ymin: -89.99893 xmax: 180 ymax: 83.59961
FALSE Geodetic CRS:  WGS 84

Representamos gráficamente land:

plot(land)
FALSE Error : The fig.showtext code chunk option must be TRUE
FALSE Error : The fig.showtext code chunk option must be TRUE
FALSE Error : The fig.showtext code chunk option must be TRUE
FALSE Error : The fig.showtext code chunk option must be TRUE

Al ejecutar este código observamos que se generan varios mapas diferentes en función de los atributos del shapefile que hemos descargado. De todos los datos del shapefile solo nos interesa la geometría, que es lo que vamos a dibujar. Además ajustaremos las coordenadas para dibujar únicamente Europa:

plot(land$geometry,
     col="grey",
     lty=0,ylim=c(30,60),
     xlim=c(-5,35))
FALSE Error : The fig.showtext code chunk option must be TRUE

También podemos obtener el mismo mapa pero con las fronteras de los países al utilizar boundars:

plot(boundars$geometry,
     col="grey",
     border="white",
     ylim=c(30,60),
     xlim=c(-5,35))
FALSE Error : The fig.showtext code chunk option must be TRUE

E. Batimetría, utilización de marmap

A estos mapas podemos añadir la batimetría (profundidad del fondo marino), para esto tenemos el paquete marmap. Con el siguiente comando generamos una capa raster para la batimetría y escogiendo la región de la que queremos la batimetría por medio de un extent:

BATHYMET<-getNOAA.bathy(
  lon1= 70,
  lon2= -45,
  lat1= 75,
  lat2= 20,
  resolution=8)
FALSE Querying NOAA database ...
FALSE This may take seconds to minutes, depending on grid size
FALSE Building bathy matrix ...

Añadir la batimetría a un mapa

Lo primero que debemos hacer es generar una paleta de colores que marque la profundidad del agua, nosotros hemos generado la siguiente paleta:

blues <- c( "#21295C",
            "#1B3B6F",
            "#065A82",
            "#1C7293")

A continuación representamos la batimetría:

plot(BATHYMET,
     image = TRUE,
     land = TRUE,
     lwd = 0.05,
     lty=0,
     ylim=c(25,70),
     xlim=c(-8,35),
     bpal = list(c(0, max(BATHYMET), "#1C7293"),
                 c(min(BATHYMET),0,blues)), add=F)
FALSE Error : The fig.showtext code chunk option must be TRUE

Aquí bpal específica como se aplica la escala de colores al mapa.

Por encima de la batimetría dibujamos la tierra:

plot(boundars$geometry,
     col="#1C7C54",
     border="#73E2A7",
     ylim=c(30,65),
     xlim=c(-8,35),
     add=T)
FALSE Error in polypath(p_bind(L), border = border[i], lty = lty[i], lwd = lwd[i], : plot.new has not been called yet

F. Relieves, utilización de hillshade

Por medio del paquete hillshade vamos a añadir el relieve. Vamos a utilizar el mapa que habíamos obtenido al principio:

mapaspain
FALSE Object of class "SpatialPolygonsDataFrame" (package sp):
FALSE 
FALSE Number of SpatialPolygons:  1
FALSE 
FALSE Variables measured:
FALSE       ne_10m_adm ScaleRank LabelRank    FeatureCla OID_ SOVEREIGNT SOV_A3
FALSE Spain        ESP         1         2 Adm-0 country  233      Spain    ESP
FALSE       ADM0_DIF LEVEL              TYPE ADMIN ADM0_A3 GEOU_DIF GEOUNIT GU_A3
FALSE Spain        0     2 Sovereign country Spain     ESP        0   Spain   ESP
FALSE       SU_DIF SUBUNIT SU_A3  NAME ABBREV POSTAL       NAME_FORMA TERR_ NAME_SORT
FALSE Spain      0   Spain   ESP Spain    Sp.      E Kingdom of Spain  <NA>     Spain
FALSE       MAP_COLOR  POP_EST GDP_MD_EST FIPS_10_ ISO_A2 ISO_A3 ISO_N3 ISO3
FALSE Spain         5 40525002    1403000        0     ES    ESP    724  ESP
FALSE             LON      LAT ISO3.1 ADMIN.1 REGION continent GEO3major
FALSE Spain -3.565944 40.40002    ESP   Spain Europe   Eurasia    Europe
FALSE                 GEO3        IMAGE24 GLOCAF  Stern SRESmajor
FALSE Spain Western Europe Western Europe Europe Europe    OECD90
FALSE                       SRES             GBD AVOIDnumeric AVOIDname   LDC   SID
FALSE Spain Western Europe (WEU) Europe, Western           25    Europe other other
FALSE        LLDC
FALSE Spain other

En primer lugar vamos a obtener los datos del relieve con getData, de forma que obtendremos los datos de altura de España, al poner mask = T conseguimos que nos de solo los datos de España y que no nos dé datos de los países circundantes. Posteriormente dibujamos el relieve:

altSpain <- getData('alt',
                    country='ESP',
                    mask=T)
plot(altSpain)
FALSE Error : The fig.showtext code chunk option must be TRUE
FALSE Error : The fig.showtext code chunk option must be TRUE

str (altSpain)
FALSE Formal class 'RasterLayer' [package "raster"] with 12 slots
FALSE   ..@ file    :Formal class '.RasterFile' [package "raster"] with 13 slots
FALSE   .. .. ..@ name        : chr "C:\\Users\\tsuba\\OneDrive\\Escritorio\\MANUAL\\ESP_msk_alt.grd"
FALSE   .. .. ..@ datanotation: chr "INT2S"
FALSE   .. .. ..@ byteorder   : Named chr "little"
FALSE   .. .. .. ..- attr(*, "names")= chr "value"
FALSE   .. .. ..@ nodatavalue : num -9999
FALSE   .. .. ..@ NAchanged   : logi FALSE
FALSE   .. .. ..@ nbands      : int 1
FALSE   .. .. ..@ bandorder   : Named chr "BIL"
FALSE   .. .. .. ..- attr(*, "names")= chr "value"
FALSE   .. .. ..@ offset      : int 0
FALSE   .. .. ..@ toptobottom : logi TRUE
FALSE   .. .. ..@ blockrows   : int 0
FALSE   .. .. ..@ blockcols   : int 0
FALSE   .. .. ..@ driver      : chr "raster"
FALSE   .. .. ..@ open        : logi FALSE
FALSE   ..@ data    :Formal class '.SingleLayerData' [package "raster"] with 13 slots
FALSE   .. .. ..@ values    : logi(0) 
FALSE   .. .. ..@ offset    : num 0
FALSE   .. .. ..@ gain      : num 1
FALSE   .. .. ..@ inmemory  : logi FALSE
FALSE   .. .. ..@ fromdisk  : logi TRUE
FALSE   .. .. ..@ isfactor  : logi FALSE
FALSE   .. .. ..@ attributes: list()
FALSE   .. .. ..@ haveminmax: logi TRUE
FALSE   .. .. ..@ min       : num -13
FALSE   .. .. ..@ max       : num 3322
FALSE   .. .. ..@ band      : int 1
FALSE   .. .. ..@ unit      : chr ""
FALSE   .. .. ..@ names     : chr "ESP_msk_alt"
FALSE   ..@ legend  :Formal class '.RasterLegend' [package "raster"] with 5 slots
FALSE   .. .. ..@ type      : chr(0) 
FALSE   .. .. ..@ values    : logi(0) 
FALSE   .. .. ..@ color     : logi(0) 
FALSE   .. .. ..@ names     : logi(0) 
FALSE   .. .. ..@ colortable: logi(0) 
FALSE   ..@ title   : chr(0) 
FALSE   ..@ extent  :Formal class 'Extent' [package "raster"] with 4 slots
FALSE   .. .. ..@ xmin: num -9.4
FALSE   .. .. ..@ xmax: num 4.4
FALSE   .. .. ..@ ymin: num 35.2
FALSE   .. .. ..@ ymax: num 43.9
FALSE   ..@ rotated : logi FALSE
FALSE   ..@ rotation:Formal class '.Rotation' [package "raster"] with 2 slots
FALSE   .. .. ..@ geotrans: num(0) 
FALSE   .. .. ..@ transfun:function ()  
FALSE   ..@ ncols   : int 1656
FALSE   ..@ nrows   : int 1044
FALSE   ..@ crs     :Formal class 'CRS' [package "sp"] with 1 slot
FALSE   .. .. ..@ projargs: chr "+proj=longlat +datum=WGS84 +no_defs"
FALSE   .. .. ..$ comment: chr "GEOGCRS[\"unknown\",\n    DATUM[\"World Geodetic System 1984\",\n        ELLIPSOID[\"WGS 84\",6378137,298.25722"| __truncated__
FALSE   ..@ history : list()
FALSE   ..@ z       : list()

Al ver la estructura de los datos comprobamos que se trata de un archivo raster que sigue el sistema de coordenadas CRS.

Como no nos agrada la escala de colores que han utilizado vamos a cambiarla:

alt2= altSpain
res(alt2)= 0.02166666 # aquí disminuímos la resolución

Con este código estoy definiendo un nuevo mapa donde utilizo los datos de altitud de altSpain y reduzco la resolución. Posteriormente representamos este nuevo mapa:

alt3<-resample(altSpain,
               alt2,
               method='bilinear')
plot(alt3)
FALSE Error : The fig.showtext code chunk option must be TRUE
FALSE Error : The fig.showtext code chunk option must be TRUE

Sobre este mapa donde muestra el gradiente de alturas añadiremos la pendiente, el aspecto del terreno y el sombreado de las colinas:

slope <- terrain(alt3, opt='slope') # mapa de pendientes
aspect <- terrain(alt3, opt='aspect') # mapa de aspecto
hill <- hillShade(slope, aspect, 30, 250, normalize=T) # sombreado de colinas

Finalmente cambiamos el color, podríamos añadirle color generando una nueva capa, pero para que no se perdiese la forma del relieve tendríamos que darle transparencia:

plot(hill, 
     col=adjustcolor(grey(0:100/100),0.8),
     legend=FALSE,
     add=F)
FALSE Error : The fig.showtext code chunk option must be TRUE

lines(Spain,lwd=1.5)
FALSE Error in h(simpleError(msg, call)): error in evaluating the argument 'x' in selecting a method for function 'lines': object 'Spain' not found

Así conseguimos el aspecto del relieve del mapa.

5.1.3. Ejemplos de su uso

Ejemplo 1: censo de la población española

En este ejemplo vamos a trabajar con los datos del censo de las poblaciones españolas.

Primero cargamos datos del censo de población del INE, que viene disponible por defecto en el paquete mapSpain, cargaremos datos de la población mundial del año 2019:

census <- pobmun19

A continuación, vamos a descargar y guardar el código de las comunidades autónomas, usando otra vez el paquete mapSpain, y veremos su estructura con str:

codelist <- esp_codelist
str(codelist)
FALSE 'data.frame': 59 obs. of  44 variables:
FALSE  $ nuts1.code        : chr  "ES1" "ES1" "ES1" "ES1" ...
FALSE  $ nuts1.name        : chr  "NOROESTE" "NOROESTE" "NOROESTE" "NOROESTE" ...
FALSE  $ nuts1.name.alt    : chr  "Noroeste" "Noroeste" "Noroeste" "Noroeste" ...
FALSE  $ nuts1.shortname.es: chr  "Noroeste" "Noroeste" "Noroeste" "Noroeste" ...
FALSE  $ codauto           : chr  "03" "06" "12" "12" ...
FALSE  $ iso2.ccaa.code    : chr  "ES-AS" "ES-CB" "ES-GA" "ES-GA" ...
FALSE  $ nuts2.code        : chr  "ES12" "ES13" "ES11" "ES11" ...
FALSE  $ ine.ccaa.name     : chr  "Asturias, Principado de" "Cantabria" "Galicia" "Galicia" ...
FALSE  $ iso2.ccaa.name.es : chr  "Asturias, Principado de" "Cantabria" "Galicia" "Galicia" ...
FALSE  $ iso2.ccaa.name.ca : chr  NA NA NA NA ...
FALSE  $ iso2.ccaa.name.gl : chr  NA NA "Galicia" "Galicia" ...
FALSE  $ iso2.ccaa.name.eu : chr  NA NA NA NA ...
FALSE  $ nuts2.name        : chr  "Principado de Asturias" "Cantabria" "Galicia" "Galicia" ...
FALSE  $ cldr.ccaa.name.en : chr  "Asturias" "Cantabria" "Galicia" "Galicia" ...
FALSE  $ cldr.ccaa.name.es : chr  "Principado de Asturias" "Cantabria" "Galicia" "Galicia" ...
FALSE  $ cldr.ccaa.name.ca : chr  "Astúries" "Cantàbria" "Galícia" "Galícia" ...
FALSE  $ cldr.ccaa.name.ga : chr  "Principado de Asturias" "Cantabria" "Galicia" "Galicia" ...
FALSE  $ cldr.ccaa.name.eu : chr  "Asturiesko Printzerria" "Kantabria" "Galizia" "Galizia" ...
FALSE  $ ccaa.shortname.en : chr  "Asturias" "Cantabria" "Galicia" "Galicia" ...
FALSE  $ ccaa.shortname.es : chr  "Asturias" "Cantabria" "Galicia" "Galicia" ...
FALSE  $ ccaa.shortname.ca : chr  "Astúries" "Cantàbria" "Galícia" "Galícia" ...
FALSE  $ ccaa.shortname.ga : chr  "Asturias" "Cantabria" "Galicia" "Galicia" ...
FALSE  $ ccaa.shortname.eu : chr  "Asturias" "Kantabria" "Galizia" "Galizia" ...
FALSE  $ cpro              : chr  "33" "39" "15" "27" ...
FALSE  $ iso2.prov.code    : chr  "ES-O" "ES-S" "ES-C" "ES-LU" ...
FALSE  $ nuts.prov.code    : chr  "ES120" "ES130" "ES111" "ES112" ...
FALSE  $ ine.prov.name     : chr  "Asturias" "Cantabria" "Coruña, A" "Lugo" ...
FALSE  $ iso2.prov.name.es : chr  "Asturias" "Cantabria" "La Coruña" "Lugo" ...
FALSE  $ iso2.prov.name.ca : chr  NA NA NA NA ...
FALSE  $ iso2.prov.name.ga : chr  NA NA "A Coruña" "Lugo" ...
FALSE  $ iso2.prov.name.eu : chr  NA NA NA NA ...
FALSE  $ cldr.prov.name.en : chr  "Asturias" "Cantabria" "A Coruña" "Lugo" ...
FALSE  $ cldr.prov.name.es : chr  "Principado de Asturias" "Cantabria" "Provincia de La Coruña" "Provincia de Lugo" ...
FALSE  $ cldr.prov.name.ca : chr  "Astúries" "Cantàbria" "Província de la Corunya" "Província de Lugo" ...
FALSE  $ cldr.prov.name.ga : chr  "Principado de Asturias" "Cantabria" "Provincia da Coruña" "Provincia de Lugo" ...
FALSE  $ cldr.prov.name.eu : chr  "Asturiesko Printzerria" "Kantabria" "Coruñako probintzia" "Lugoko probintzia" ...
FALSE  $ prov.shortname.en : chr  "Asturias" "Cantabria" "A Coruña" "Lugo" ...
FALSE  $ prov.shortname.es : chr  "Asturias" "Cantabria" "La Coruña" "Lugo" ...
FALSE  $ prov.shortname.ca : chr  "Astúries" "Cantàbria" "La Corunya" "Lugo" ...
FALSE  $ prov.shortname.ga : chr  "Asturias" "Cantabria" "A Coruña" "Lugo" ...
FALSE  $ prov.shortname.eu : chr  "Asturias" "Kantabria" "Coruña" "Lugo" ...
FALSE  $ nuts3.code        : chr  "ES120" "ES130" "ES111" "ES112" ...
FALSE  $ nuts3.name        : chr  "Asturias" "Cantabria" "A Coruña" "Lugo" ...
FALSE  $ nuts3.shortname.es: chr  "Asturias" "Cantabria" "La Coruña" "Lugo" ...

Como podemos observar, codelist contiene un listado de todas las localidades de España y de todas las comunidades autónomas.

Ahora unimos las dos tablas utilizando el comando merge:

census <-
  unique(merge(census, codelist[, c("cpro", "codauto")], all.x = TRUE))

Agregamos los valores por comunidad autónoma:

census_ccaa <-
  aggregate(cbind(pob19, men, women) ~ codauto, data = census, sum)

Calculamos porcentajes y los guardamos como nuevas variables en nuestro dataframe añadimos una variable donde el porcentaje se represente con respecto a 100 en vez de con respecto a 1, añadiendo a la vez el símbolo % detrás del número por motivos estéticos:

En mujeres:

census_ccaa$porc_women <- census_ccaa$women / census_ccaa$pob19
census_ccaa$porc_women_lab <-
  paste0(round(100 * census_ccaa$porc_women, 2),"%")

En hombres:

census_ccaa$porc_men <- census_ccaa$men / census_ccaa$pob19
census_ccaa$porc_men_lab <-
  paste0(round(100 * census_ccaa$porc_men, 2), "%")

Observamos que se nos han creado las variables correspondientes:

head(census_ccaa)

Queremos representar estos porcentajes en un mapa, para ello vamos a unir nuestro dataframe con un shapefile donde se representen todas las comunidades autónomas de España para ello seguimos usando la librería mapSpain:

# Obtenemos el shapefile

CCAA_sf <- esp_get_ccaa()
plot(CCAA_sf$geometry)
FALSE Error : The fig.showtext code chunk option must be TRUE
# El shapefile incluye canarias de la misma manera como se representan en los atlas

# Unimos nuestro dataframe con el shapefile usando `merge`

CCAA_sf <- merge(CCAA_sf, census_ccaa)

# Recuadramos las isla canarias para que quede más bonito
Can <- esp_get_can_box()
plot(Can, add=T)

La representación de este mapa también la podemos realizar con ggplot, utilizando geom_sf para representar shapefiles:

ggplot(CCAA_sf) +   
  geom_sf(aes(fill = porc_women), 
          color = "grey70",
          lwd = .3
  ) +       
  geom_sf(data = Can, color = "grey70") +   # añadimos el recuadro de Canarias
  geom_sf_label(aes(label = porc_women_lab),  # añadimos las etiquetas de porcentajes
                fill = "white", alpha = 0.5,
                size = 3,
                label.size = 0
  ) +
  scale_fill_gradientn(
    colors = hcl.colors(10, "Blues", rev = TRUE),  # cambiamos la escala de colores
    n.breaks = 10,
    labels = function(x) {
      sprintf("%1.1f%%", 100 * x)
    },
    guide = guide_legend(title = "Porc. women")  # añadimos la leyenda
  ) +
  theme_void() +  # utilizamos un tema para que quede más bonito
  theme(legend.position = "right") # cambiamos la posición de la leyenda
FALSE Error : The fig.showtext code chunk option must be TRUE
FALSE Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
FALSE give correct results for longitude/latitude data

Ejemplo 2: censo de la población española para una provincia

Primero añadimos el porcentaje de mujeres a la tabla census:

census$porc_women <- census$women / census$pob19
census$porc_men <- census$men / census$pob19

Obtenemos capas shapefile de municipios y provincias, vamos a representar Ávila:

shape <- esp_get_munic_siane(region = "Avila", epsg = 3857)
provs <- esp_get_prov_siane(epsg = 3857)

Representamos para ver que aspecto tiene y exploramos las variables:

plot(shape$geometry) # Mapa de Ávila por municipios
FALSE Error : The fig.showtext code chunk option must be TRUE

plot(provs$geometry) # Mapa de España por provincias
FALSE Error : The fig.showtext code chunk option must be TRUE

head(shape)
head(census)

Unimos datos a escala de municipio con el comando merge y representamos:

shape_pop <- merge(shape,census,
                   by = c("cpro", "cmun"),
                   all.x = TRUE)

plot(shape_pop$geometry)
FALSE Error : The fig.showtext code chunk option must be TRUE

Obtenemos información raster para el fondo del mapa y representamos:

tile <- esp_getTiles(shape_pop,
                     type = "IGNBase.Todo",
                     zoom = 10,
                     bbox_expand = .1)

plot(tile) # la imagen incluye las carreteras, relieves, etc de Ávila
FALSE Error : The fig.showtext code chunk option must be TRUE

Dibujamos el mapa completo:

# Obtenemos el extent (es decir, los limites de Ávila) geográfico con
# la función ext del paquete `terra`

lims <- as.double(terra::ext(tile)@ptr$vector)

# Dibujamos con ggplot

ggplot(remove_missing(shape_pop, na.rm = TRUE)) +
  layer_spatraster(tile) +
  geom_sf(aes(fill = porc_women), color = NA) +
  geom_sf(data = provs, fill = NA) +
  scale_fill_gradientn(
    colours = hcl.colors(10, "RdYlBu", alpha = .4),
    n.breaks = 8,
    labels = function(x) {
      sprintf("%1.0f%%", 100 * x)
    },
    guide = guide_legend(title = "", )
  ) +
  coord_sf(
    xlim = lims[c(1, 2)],
    ylim = lims[c(3, 4)],
    expand = FALSE
  ) +
  labs(
    title = "Proporción de mujeres en Ávila por municipio (2019)",
    caption = "Source: INE"
  ) +
  theme_void() +
  theme(
    title = element_text(face = "bold")
  )
FALSE Error : The fig.showtext code chunk option must be TRUE

Ejemplo 3: representación de cuencas hidrográficas

Con el paquete mapSpain obtenemos las cuencas hidrográficas:

hydroland <- esp_get_hydrobasin(domain = "land")
hydrolandsea <- esp_get_hydrobasin(domain = "landsea")

plot(hydroland$geom)
FALSE Error : The fig.showtext code chunk option must be TRUE

ggplot(hydroland) +
  geom_sf(data = hydrolandsea, fill = "#C6E0FF", alpha = .4) +
  geom_sf(fill = "#C6E0FF", alpha = .5, color= "#42858C") +
  geom_sf_text(aes(label = rotulo),
               size = 3, check_overlap = TRUE,
               fontface = "bold",
               family = "sans"
  ) +
  coord_sf(
    xlim = c(-9.5, 4.5),
    ylim = c(35, 44)
  ) +
  theme_void()
FALSE Error : The fig.showtext code chunk option must be TRUE
FALSE Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
FALSE give correct results for longitude/latitude data

Así hemos representado todas las cuencas hidrográficas de España, exceptuando Canarias

Ejemplo 4: representación de altitud y batimetría

Descargamos datos de batimetría y altimetría utilizando mapSpain:

hypsobath <- esp_get_hypsobath()

Hay que corregir un error en los datos de origen y usamos Remove:

hypsobath <- hypsobath[!sf::st_is_empty(hypsobath), ]

En la representación gráfica emplearemos los colores utilizados en los atlas, los cuales hemos obtenido a través de wikipedia en el siguiente enlace: https://en.wikipedia.org/wiki/Wikipedia:WikiProject_Maps/Conventions/Topographic_maps

Establecemos las paletas de colores:

# Para la batimetría

bath_tints <- colorRampPalette(
  rev(
    c(
      "#D8F2FE", "#C6ECFF", "#B9E3FF",
      "#ACDBFB", "#A1D2F7", "#96C9F0",
      "#8DC1EA", "#84B9E3", "#79B2DE",
      "#71ABD8"
    )
  )
)

# Para la altitud

hyps_tints <- colorRampPalette(
  rev(
    c(
      "#F5F4F2", "#E0DED8", "#CAC3B8", "#BAAE9A",
      "#AC9A7C", "#AA8753", "#B9985A", "#C3A76B",
      "#CAB982", "#D3CA9D", "#DED6A3", "#E8E1B6",
      "#EFEBC0", "#E1E4B5", "#D1D7AB", "#BDCC96",
      "#A8C68F", "#94BF8B", "#ACD0A5"
    )
  )
)

Ordenamos en nuestro dataframe los niveles de altura para nos coloree de menor altura a mayor altura siguiendo la paleta de colores que hemos definido:

levels <- sort(unique(hypsobath$val_inf))

Establecemos los parametros de la paleta:

br_bath <- length(levels[levels < 0])

br_terrain <- length(levels) - br_bath

pal <- c(bath_tints((br_bath)), hyps_tints((br_terrain)))

Hacemos la representación para las islas Canarias:

ggplot(hypsobath) +
  geom_sf(aes(fill = as.factor(val_inf)),
          color = NA
  ) +
  coord_sf(
    xlim = c(-18.6, -13),
    ylim = c(27, 29.5)
  ) +
  scale_fill_manual(values = pal) +
  guides(fill = guide_legend(
    title = "Elevation",
    direction = "horizontal",
    label.position = "bottom",
    title.position = "top",
    nrow = 1
  )) +
  theme(legend.position = "bottom")
FALSE Error : The fig.showtext code chunk option must be TRUE

Representamos para la Península y Baleares:

spainhypbat <- ggplot(hypsobath) +
  geom_sf(aes(fill = as.factor(val_inf)),
          color = NA
  ) +
  coord_sf(
    xlim = c(-9.5, 4.4),
    ylim = c(35.8, 44)
  ) +
  scale_fill_manual(values = pal) +
  guides(fill = guide_legend(
    title = "Elevation",
    reverse = TRUE,
    keyheight = .8
  )) 

spainhypbat
FALSE Error : The fig.showtext code chunk option must be TRUE

5.1.4: Extracción de datos biológicos de la distribución de las especies a partir de GBIF

Podemos querer trabajar con distribuciones de especies, una forma rápida de obtener estos datos con R es a partir de GBIF.

¿Qué es GBIF?

GBIF es una red online donde se permite el acceso libre y abierto a información de la biodiversidad de países y regiones del todo el mundo para la investigación científica. Lo más interesante es que ahora se puede acceder a está red desde R, facilitando aún más la obtención de datos.

Trabajo con GBIF

Vamos a extraer datos de la distribución y presencia para el lince ibérico (Lynx pardinus)

lynx <- gbif("Lynx", "pardinus")  # hacemos una búqueda en GBIF    
FALSE 1316 records found
FALSE 0-300-600-900-1200-1316 records downloaded
lynx

La base de datos es muy grande, así que realizaremos un subset (equivale a selectde tidyverse) de los mismos donde nos queramos con las coordenadas y el país donde se encuentra y ahora convertimos nuestros datos de distribución del lince en un dataframe con coordenadas geográficas. Podemos incluso especificar que solo seleccione datos de un determinado extent, pero en el caso del lince ibérico esto carecería de sentido ya que se trata de una especie endémica de la península ibérica.

pres.lynx <- subset(lynx, select=c("country", "lat", "lon"))
head(pres.lynx)  

Descartamos posibles errores realizando otro subset planteando una condición lógica:

pres.lynx <- subset(pres.lynx, pres.lynx$lat<90)

Mapeamos la distribución del Lince sobre el mapa anterior de España (donde habíamos representado la altimetría y batimetría):

dev.off()
FALSE windows 
FALSE       3
spainhypbat +
  geom_sf(data = provs, colour='white', fill = "white", alpha = .001) +
  geom_point(data=pres.lynx, aes(x = lon, y = lat), color = "#FF6B6B", alpha= 0.6) +
  coord_sf(
    xlim = c(-9.5, 4.4),
    ylim = c(35.8, 44)
  )+
  labs ( y= "Latitud", x= "Longitud")
FALSE Coordinate system already present. Adding new coordinate system, which will replace the existing one.
FALSE Error : The fig.showtext code chunk option must be TRUE

Como se puede observar la mayor presencia del lince se encuentra en la zona sur de la Península hacia sierra morena y en la región inferior de Portugal, también hay bastantes presencias entorno al sistema central.

Vamos a generar otro mapa de presencias usando mapas anteriores y usamos rbase:

newmap <- getMap(resolution = "high")

par(mar=c(0.5,0.5,0.5,0.5)) # ajustamos los márgenes
plot(newmap, col="lightgrey", border="white", xlim=c(-7,3), ylim=c(34,45))
FALSE Warning in wkt(obj): CRS object has no comment
FALSE Error : The fig.showtext code chunk option must be TRUE
points(pres.lynx$lon,pres.lynx$lat,# con esto metemos la presencia del lince en puntos
       pch=19,cex=1,col=adjustcolor("#FF6B6B",0.4))
text(0,45,substitute(italic("Lynx pardinus")),cex=2) # ajustamos la posición del título

Vamos a crear un SpatialPointsDataFrame (es decir, un dataframe con coordenadas) a través de coordinates, donde tengo que definir mis valores de x e y:

coordinates(pres.lynx) <- c("lon", "lat")    
plot(pres.lynx)
FALSE Error : The fig.showtext code chunk option must be TRUE

pres.lynx
FALSE class       : SpatialPointsDataFrame 
FALSE features    : 1106 
FALSE extent      : -8.95937, 1.9197, 36.79, 42.261  (xmin, xmax, ymin, ymax)
FALSE crs         : NA 
FALSE variables   : 1
FALSE names       :  country 
FALSE min values  : Portugal 
FALSE max values  :    Spain

Exploramos el sistema de coordenadas:

projection(pres.lynx) 
FALSE [1] NA

No hay ningún sistema de coordenadas, así que vamos a utilizar CRS para definir uno. Vamos a asignar una proyección geográfica basada en el datum WGS84 que suele utilizarse como referencia por defecto:

crs.geo <- CRS("+proj=longlat +ellps=WGS84 +datum=WGS84")

# Donde +proj= proyección long-lat, el elipsoide (ellps = WGS84) y datum es el sistema de referencia

# Asignamos el sistema de coordenadas a nuestros datos:

proj4string(pres.lynx) <- crs.geo # para añadir esta proyección `ggmap` y `ggplot` lo hacen automáticamente
                                  # pero hay fuentes de datos que son complejas donde estos no
                                  # funcionan y entonces se debe hacer manualmente como en este caso
str(pres.lynx)
FALSE Formal class 'SpatialPointsDataFrame' [package "sp"] with 5 slots
FALSE   ..@ data       :'data.frame':   1106 obs. of  1 variable:
FALSE   .. ..$ country: chr [1:1106] "Spain" "Spain" "Spain" "Spain" ...
FALSE   ..@ coords.nrs : int [1:2] 3 2
FALSE   ..@ coords     : num [1:1106, 1:2] -6.69 -3.83 -4.15 -3.85 -7.61 ...
FALSE   .. ..- attr(*, "dimnames")=List of 2
FALSE   .. .. ..$ : chr [1:1106] "1" "2" "3" "4" ...
FALSE   .. .. ..$ : chr [1:2] "lon" "lat"
FALSE   ..@ bbox       : num [1:2, 1:2] -8.96 36.79 1.92 42.26
FALSE   .. ..- attr(*, "dimnames")=List of 2
FALSE   .. .. ..$ : chr [1:2] "lon" "lat"
FALSE   .. .. ..$ : chr [1:2] "min" "max"
FALSE   ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slot
FALSE   .. .. ..@ projargs: chr "+proj=longlat +datum=WGS84 +no_defs"
FALSE   .. .. ..$ comment: chr "GEOGCRS[\"unknown\",\n    DATUM[\"World Geodetic System 1984\",\n        ELLIPSOID[\"WGS 84\",6378137,298.25722"| __truncated__

Vamos a crear un subconjunto a partir del mapa del mundo, solo para España:

spainmap=newmap["Spain",]

plot(spainmap)
FALSE Warning in wkt(obj): CRS object has no comment
FALSE Error : The fig.showtext code chunk option must be TRUE

str(spainmap)
FALSE Formal class 'SpatialPolygonsDataFrame' [package "sp"] with 5 slots
FALSE   ..@ data       :'data.frame':   1 obs. of  51 variables:
FALSE   .. ..$ ne_10m_adm  : Factor w/ 253 levels "ABW","AFG","AGO",..: 71
FALSE   .. ..$ ScaleRank   : int 1
FALSE   .. ..$ LabelRank   : int 2
FALSE   .. ..$ FeatureCla  : Factor w/ 1 level "Adm-0 country": 1
FALSE   .. ..$ OID_        : int 233
FALSE   .. ..$ SOVEREIGNT  : Factor w/ 204 levels "Afghanistan",..: 170
FALSE   .. ..$ SOV_A3      : Factor w/ 205 levels "AFG","AGO","ALB",..: 57
FALSE   .. ..$ ADM0_DIF    : num 0
FALSE   .. ..$ LEVEL       : num 2
FALSE   .. ..$ TYPE        : Factor w/ 7 levels "Country","County",..: 7
FALSE   .. ..$ ADMIN       : Factor w/ 253 levels "Afghanistan",..: 213
FALSE   .. ..$ ADM0_A3     : Factor w/ 253 levels "ABW","AFG","AGO",..: 71
FALSE   .. ..$ GEOU_DIF    : num 0
FALSE   .. ..$ GEOUNIT     : Factor w/ 253 levels "Afghanistan",..: 213
FALSE   .. ..$ GU_A3       : Factor w/ 253 levels "ABW","AFG","AGO",..: 71
FALSE   .. ..$ SU_DIF      : num 0
FALSE   .. ..$ SUBUNIT     : Factor w/ 253 levels "Afghanistan",..: 213
FALSE   .. ..$ SU_A3       : Factor w/ 253 levels "ABW","AFG","AGO",..: 71
FALSE   .. ..$ NAME        : Factor w/ 250 levels "Afghanistan",..: 207
FALSE   .. ..$ ABBREV      : Factor w/ 247 levels "A.C.Is.","Afg.",..: 200
FALSE   .. ..$ POSTAL      : Factor w/ 240 levels "A","AE","AF",..: 62
FALSE   .. ..$ NAME_FORMA  : Factor w/ 196 levels "Arab Republic of Egypt",..: 55
FALSE   .. ..$ TERR_       : Factor w/ 15 levels "Assoc. with N.Z.",..: NA
FALSE   .. ..$ NAME_SORT   : Factor w/ 253 levels "Afghanistan",..: 215
FALSE   .. ..$ MAP_COLOR   : num 5
FALSE   .. ..$ POP_EST     : num 40525002
FALSE   .. ..$ GDP_MD_EST  : num 1403000
FALSE   .. ..$ FIPS_10_    : num 0
FALSE   .. ..$ ISO_A2      : Factor w/ 237 levels "-99","AD","AE",..: 63
FALSE   .. ..$ ISO_A3      : Factor w/ 253 levels "ABW","AFG","AGO",..: 71
FALSE   .. ..$ ISO_N3      : num 724
FALSE   .. ..$ ISO3        : Factor w/ 253 levels "ABW","AFG","AGO",..: 71
FALSE   .. ..$ LON         : num -3.57
FALSE   .. ..$ LAT         : num 40.4
FALSE   .. ..$ ISO3.1      : Factor w/ 253 levels "ABW","AFG","AGO",..: 71
FALSE   .. ..$ ADMIN.1     : Factor w/ 253 levels "Afghanistan",..: 213
FALSE   .. ..$ REGION      : Factor w/ 7 levels "Africa","Antarctica",..: 5
FALSE   .. ..$ continent   : Factor w/ 6 levels "Africa","Antarctica",..: 4
FALSE   .. ..$ GEO3major   : Factor w/ 7 levels "Africa","Asia and the Pacific",..: 3
FALSE   .. ..$ GEO3        : Factor w/ 24 levels "Antarctic","Arabian Peninsula",..: 23
FALSE   .. ..$ IMAGE24     : Factor w/ 26 levels "Antarctica","Asia-Stan",..: 26
FALSE   .. ..$ GLOCAF      : Factor w/ 19 levels "Brazil","Canada",..: 4
FALSE   .. ..$ Stern       : Factor w/ 13 levels "Australasia",..: 6
FALSE   .. ..$ SRESmajor   : Factor w/ 4 levels "ALM","ASIA","OECD90",..: 3
FALSE   .. ..$ SRES        : Factor w/ 11 levels "Central and Eastern Europe (EEU)",..: 11
FALSE   .. ..$ GBD         : Factor w/ 21 levels "Asia Pacific, High Income",..: 10
FALSE   .. ..$ AVOIDnumeric: int 25
FALSE   .. ..$ AVOIDname   : Factor w/ 30 levels "Australia","Brazil",..: 7
FALSE   .. ..$ LDC         : Factor w/ 2 levels "LDC","other": 2
FALSE   .. ..$ SID         : Factor w/ 2 levels "other","SID": 1
FALSE   .. ..$ LLDC        : Factor w/ 2 levels "LLDC","other": 2
FALSE   ..@ polygons   :List of 1
FALSE   .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots
FALSE   .. .. .. ..@ Polygons :List of 17
FALSE   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
FALSE   .. .. .. .. .. .. ..@ labpt  : num [1:2] -3.57 40.4
FALSE   .. .. .. .. .. .. ..@ area   : num 52.5
FALSE   .. .. .. .. .. .. ..@ hole   : logi FALSE
FALSE   .. .. .. .. .. .. ..@ ringDir: int 1
FALSE   .. .. .. .. .. .. ..@ coords : num [1:2124, 1:2] -7.7 -7.69 -7.68 -7.67 -7.67 ...
FALSE   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
FALSE   .. .. .. .. .. .. ..@ labpt  : num [1:2] 2.96 39.63
FALSE   .. .. .. .. .. .. ..@ area   : num 0.387
FALSE   .. .. .. .. .. .. ..@ hole   : logi FALSE
FALSE   .. .. .. .. .. .. ..@ ringDir: int 1
FALSE   .. .. .. .. .. .. ..@ coords : num [1:154, 1:2] 3.18 3.19 3.2 3.2 3.21 ...
FALSE   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
FALSE   .. .. .. .. .. .. ..@ labpt  : num [1:2] -16.5 28.3
FALSE   .. .. .. .. .. .. ..@ area   : num 0.191
FALSE   .. .. .. .. .. .. ..@ hole   : logi FALSE
FALSE   .. .. .. .. .. .. ..@ ringDir: int 1
FALSE   .. .. .. .. .. .. ..@ coords : num [1:87, 1:2] -16.1 -16.1 -16.1 -16.2 -16.3 ...
FALSE   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
FALSE   .. .. .. .. .. .. ..@ labpt  : num [1:2] -14 28.4
FALSE   .. .. .. .. .. .. ..@ area   : num 0.151
FALSE   .. .. .. .. .. .. ..@ hole   : logi FALSE
FALSE   .. .. .. .. .. .. ..@ ringDir: int 1
FALSE   .. .. .. .. .. .. ..@ coords : num [1:70, 1:2] -14.2 -14.3 -14.3 -14.3 -14.4 ...
FALSE   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
FALSE   .. .. .. .. .. .. ..@ labpt  : num [1:2] -15.6 28
FALSE   .. .. .. .. .. .. ..@ area   : num 0.143
FALSE   .. .. .. .. .. .. ..@ hole   : logi FALSE
FALSE   .. .. .. .. .. .. ..@ ringDir: int 1
FALSE   .. .. .. .. .. .. ..@ coords : num [1:75, 1:2] -15.4 -15.4 -15.4 -15.4 -15.4 ...
FALSE   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
FALSE   .. .. .. .. .. .. ..@ labpt  : num [1:2] -13.6 29
FALSE   .. .. .. .. .. .. ..@ area   : num 0.0767
FALSE   .. .. .. .. .. .. ..@ hole   : logi FALSE
FALSE   .. .. .. .. .. .. ..@ ringDir: int 1
FALSE   .. .. .. .. .. .. ..@ coords : num [1:64, 1:2] -13.8 -13.8 -13.8 -13.8 -13.9 ...
FALSE   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
FALSE   .. .. .. .. .. .. ..@ labpt  : num [1:2] 4.1 40
FALSE   .. .. .. .. .. .. ..@ area   : num 0.0729
FALSE   .. .. .. .. .. .. ..@ hole   : logi FALSE
FALSE   .. .. .. .. .. .. ..@ ringDir: int 1
FALSE   .. .. .. .. .. .. ..@ coords : num [1:67, 1:2] 4.13 4.15 4.15 4.15 4.15 ...
FALSE   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
FALSE   .. .. .. .. .. .. ..@ labpt  : num [1:2] -17.8 28.7
FALSE   .. .. .. .. .. .. ..@ area   : num 0.0648
FALSE   .. .. .. .. .. .. ..@ hole   : logi FALSE
FALSE   .. .. .. .. .. .. ..@ ringDir: int 1
FALSE   .. .. .. .. .. .. ..@ coords : num [1:42, 1:2] -17.9 -17.8 -17.8 -17.8 -17.8 ...
FALSE   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
FALSE   .. .. .. .. .. .. ..@ labpt  : num [1:2] 1.42 39
FALSE   .. .. .. .. .. .. ..@ area   : num 0.0637
FALSE   .. .. .. .. .. .. ..@ hole   : logi FALSE
FALSE   .. .. .. .. .. .. ..@ ringDir: int 1
FALSE   .. .. .. .. .. .. ..@ coords : num [1:69, 1:2] 1.59 1.6 1.61 1.61 1.61 ...
FALSE   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
FALSE   .. .. .. .. .. .. ..@ labpt  : num [1:2] -17.2 28.1
FALSE   .. .. .. .. .. .. ..@ area   : num 0.032
FALSE   .. .. .. .. .. .. ..@ hole   : logi FALSE
FALSE   .. .. .. .. .. .. ..@ ringDir: int 1
FALSE   .. .. .. .. .. .. ..@ coords : num [1:19, 1:2] -17.2 -17.2 -17.2 -17.2 -17.2 ...
FALSE   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
FALSE   .. .. .. .. .. .. ..@ labpt  : num [1:2] -18 27.7
FALSE   .. .. .. .. .. .. ..@ area   : num 0.0276
FALSE   .. .. .. .. .. .. ..@ hole   : logi FALSE
FALSE   .. .. .. .. .. .. ..@ ringDir: int 1
FALSE   .. .. .. .. .. .. ..@ coords : num [1:40, 1:2] -17.9 -17.9 -17.9 -17.9 -17.9 ...
FALSE   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
FALSE   .. .. .. .. .. .. ..@ labpt  : num [1:2] 1.47 38.7
FALSE   .. .. .. .. .. .. ..@ area   : num 0.00896
FALSE   .. .. .. .. .. .. ..@ hole   : logi FALSE
FALSE   .. .. .. .. .. .. ..@ ringDir: int 1
FALSE   .. .. .. .. .. .. ..@ coords : num [1:33, 1:2] 1.45 1.49 1.51 1.57 1.59 ...
FALSE   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
FALSE   .. .. .. .. .. .. ..@ labpt  : num [1:2] -5.35 35.89
FALSE   .. .. .. .. .. .. ..@ area   : num 0.0043
FALSE   .. .. .. .. .. .. ..@ hole   : logi FALSE
FALSE   .. .. .. .. .. .. ..@ ringDir: int 1
FALSE   .. .. .. .. .. .. ..@ coords : num [1:14, 1:2] -5.33 -5.31 -5.28 -5.29 -5.33 ...
FALSE   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
FALSE   .. .. .. .. .. .. ..@ labpt  : num [1:2] -13.5 29.3
FALSE   .. .. .. .. .. .. ..@ area   : num 0.0022
FALSE   .. .. .. .. .. .. ..@ hole   : logi FALSE
FALSE   .. .. .. .. .. .. ..@ ringDir: int 1
FALSE   .. .. .. .. .. .. ..@ coords : num [1:10, 1:2] -13.5 -13.5 -13.5 -13.5 -13.5 ...
FALSE   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
FALSE   .. .. .. .. .. .. ..@ labpt  : num [1:2] -2.94 35.3
FALSE   .. .. .. .. .. .. ..@ area   : num 0.00182
FALSE   .. .. .. .. .. .. ..@ hole   : logi FALSE
FALSE   .. .. .. .. .. .. ..@ ringDir: int 1
FALSE   .. .. .. .. .. .. ..@ coords : num [1:7, 1:2] -2.91 -2.94 -2.96 -2.97 -2.95 ...
FALSE   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
FALSE   .. .. .. .. .. .. ..@ labpt  : num [1:2] 1.97 42.46
FALSE   .. .. .. .. .. .. ..@ area   : num 0.00144
FALSE   .. .. .. .. .. .. ..@ hole   : logi FALSE
FALSE   .. .. .. .. .. .. ..@ ringDir: int 1
FALSE   .. .. .. .. .. .. ..@ coords : num [1:12, 1:2] 1.99 1.98 1.96 1.95 1.95 ...
FALSE   .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
FALSE   .. .. .. .. .. .. ..@ labpt  : num [1:2] -0.743 37.723
FALSE   .. .. .. .. .. .. ..@ area   : num 0.00115
FALSE   .. .. .. .. .. .. ..@ hole   : logi FALSE
FALSE   .. .. .. .. .. .. ..@ ringDir: int 1
FALSE   .. .. .. .. .. .. ..@ coords : num [1:15, 1:2] -0.74 -0.726 -0.746 -0.751 -0.75 ...
FALSE   .. .. .. ..@ plotOrder: int [1:17] 1 2 3 4 5 6 7 8 9 10 ...
FALSE   .. .. .. ..@ labpt    : num [1:2] -3.57 40.4
FALSE   .. .. .. ..@ ID       : chr "Spain"
FALSE   .. .. .. ..@ area     : num 53.8
FALSE   .. .. .. ..$ comment: chr "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
FALSE   ..@ plotOrder  : int 1
FALSE   ..@ bbox       : num [1:2, 1:2] -18.17 27.64 4.35 43.81
FALSE   .. ..- attr(*, "dimnames")=List of 2
FALSE   .. .. ..$ : chr [1:2] "x" "y"
FALSE   .. .. ..$ : chr [1:2] "min" "max"
FALSE   ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slot
FALSE   .. .. ..@ projargs: chr " +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0"
FALSE   ..$ comment: chr "FALSE"

Con @ puedo explorar lo que tiene, por ejemplo polygons son polígonos, proj4string es la proyección, de hecho para quedarme con solo la península en vez de recortar el extent como hemos hecho anteriormente puedo acceder a los polígonos y seleccionar únicamente el polígono de la península:

spainmap@polygons[[1]]@Polygons[[1]]
FALSE An object of class "Polygon"
FALSE Slot "labpt":
FALSE [1] -3.565944 40.400021
FALSE 
FALSE Slot "area":
FALSE [1] 52.52818
FALSE 
FALSE Slot "hole":
FALSE [1] FALSE
FALSE 
FALSE Slot "ringDir":
FALSE [1] 1
FALSE 
FALSE Slot "coords":
FALSE                 [,1]     [,2]
FALSE    [1,] -7.695520386 43.74317
FALSE    [2,] -7.691024537 43.73896
FALSE    [3,] -7.683298910 43.74046
FALSE    [4,] -7.674539754 43.74335
FALSE    [5,] -7.672989462 43.74609
FALSE    [6,] -7.673454550 43.75090
FALSE    [7,] -7.671852580 43.75552
FALSE    [8,] -7.663997762 43.75756
FALSE    [9,] -7.657434855 43.75829
FALSE   [10,] -7.640381633 43.76444
FALSE   [11,] -7.637074341 43.75077
FALSE   [12,] -7.612476359 43.71601
FALSE   [13,] -7.615318563 43.70020
FALSE   [14,] -7.606481893 43.70279
FALSE   [15,] -7.593976196 43.71542
FALSE   [16,] -7.585759644 43.72968
FALSE   [17,] -7.573615682 43.72627
FALSE   [18,] -7.564830688 43.73154
FALSE   [19,] -7.555218872 43.73932
FALSE   [20,] -7.540749471 43.74335
FALSE   [21,] -7.501423706 43.74002
FALSE   [22,] -7.489538127 43.73710
FALSE   [23,] -7.407010864 43.70297
FALSE   [24,] -7.366496542 43.67984
FALSE   [25,] -7.303502971 43.61628
FALSE   [26,] -7.256167358 43.59930
FALSE   [27,] -7.259578003 43.59520
FALSE   [28,] -7.261593384 43.59199
FALSE   [29,] -7.264538941 43.58918
FALSE   [30,] -7.270430054 43.58631
FALSE   [31,] -7.270430054 43.57881
FALSE   [32,] -7.257045858 43.57434
FALSE   [33,] -7.248932658 43.57706
FALSE   [34,] -7.241439575 43.58256
FALSE   [35,] -7.229502320 43.58631
FALSE   [36,] -7.214826212 43.58631
FALSE   [37,] -7.194258993 43.58114
FALSE   [38,] -7.156380168 43.57698
FALSE   [39,] -7.095246949 43.57868
FALSE   [40,] -7.078607138 43.58631
FALSE   [41,] -7.060933798 43.57928
FALSE   [42,] -7.043622192 43.57706
FALSE   [43,] -7.031788290 43.57067
FALSE   [44,] -7.030237996 43.55093
FALSE   [45,] -7.037162638 43.53993
FALSE   [46,] -7.047756307 43.52807
FALSE   [47,] -7.053027303 43.51419
FALSE   [48,] -7.043880575 43.49693
FALSE   [49,] -7.037731079 43.49693
FALSE   [50,] -7.032098348 43.51324
FALSE   [51,] -7.028894409 43.52988
FALSE   [52,] -7.023106649 43.54357
FALSE   [53,] -7.009774129 43.55093
FALSE   [54,] -7.000782430 43.57434
FALSE   [55,] -6.943369914 43.58372
FALSE   [56,] -6.845288046 43.58631
FALSE   [57,] -6.830043498 43.58284
FALSE   [58,] -6.770202189 43.58631
FALSE   [59,] -6.729067749 43.57750
FALSE   [60,] -6.703126180 43.57530
FALSE   [61,] -6.647987427 43.59682
FALSE   [62,] -6.597086141 43.59292
FALSE   [63,] -6.545978149 43.57956
FALSE   [64,] -6.509494588 43.56522
FALSE   [65,] -6.499055949 43.57083
FALSE   [66,] -6.487635457 43.57285
FALSE   [67,] -6.462417359 43.57259
FALSE   [68,] -6.464019328 43.57739
FALSE   [69,] -6.466603150 43.58858
FALSE   [70,] -6.468515178 43.59308
FALSE   [71,] -6.454614218 43.59098
FALSE   [72,] -6.431204793 43.58114
FALSE   [73,] -6.416993775 43.57881
FALSE   [74,] -6.365524048 43.58631
FALSE   [75,] -6.314002645 43.58631
FALSE   [76,] -6.299429891 43.58830
FALSE   [77,] -6.273333293 43.59729
FALSE   [78,] -6.249458781 43.60176
FALSE   [79,] -6.243205932 43.60703
FALSE   [80,] -6.235816203 43.61199
FALSE   [81,] -6.222121948 43.61357
FALSE   [82,] -6.190340943 43.59625
FALSE   [83,] -6.177421834 43.59308
FALSE   [84,] -6.099752156 43.58695
FALSE   [85,] -6.084300904 43.59308
FALSE   [86,] -6.068539592 43.58739
FALSE   [87,] -6.053501750 43.59228
FALSE   [88,] -6.038618937 43.60080
FALSE   [89,] -6.022805949 43.60618
FALSE   [90,] -5.906844035 43.60618
FALSE   [91,] -5.901521363 43.61522
FALSE   [92,] -5.908239299 43.62266
FALSE   [93,] -5.912476766 43.63052
FALSE   [94,] -5.899971070 43.64093
FALSE   [95,] -5.901986450 43.64421
FALSE   [96,] -5.904725302 43.65150
FALSE   [97,] -5.906844035 43.65460
FALSE   [98,] -5.874442912 43.65444
FALSE   [99,] -5.862867391 43.65912
FALSE  [100,] -5.858474894 43.67129
FALSE  [101,] -5.851601929 43.68067
FALSE  [102,] -5.835737265 43.67992
FALSE  [103,] -5.803181112 43.66821
FALSE  [104,] -5.781787069 43.65475
FALSE  [105,] -5.726855021 43.60724
FALSE  [106,] -5.708148153 43.58631
FALSE  [107,] -5.701378540 43.58631
FALSE  [108,] -5.696159220 43.60057
FALSE  [109,] -5.688511109 43.59631
FALSE  [110,] -5.676883912 43.57881
FALSE  [111,] -5.625052450 43.57259
FALSE  [112,] -5.423617717 43.57881
FALSE  [113,] -5.393231975 43.57290
FALSE  [114,] -5.390131388 43.55902
FALSE  [115,] -5.402947144 43.54311
FALSE  [116,] -5.420207072 43.53104
FALSE  [117,] -5.413385783 43.52422
FALSE  [118,] -5.402998820 43.52882
FALSE  [119,] -5.382018189 43.53406
FALSE  [120,] -5.371786255 43.53789
FALSE  [121,] -5.364396525 43.54440
FALSE  [122,] -5.361605998 43.55106
FALSE  [123,] -5.356128296 43.55628
FALSE  [124,] -5.341348837 43.55832
FALSE  [125,] -5.299232544 43.55535
FALSE  [126,] -5.283367879 43.55114
FALSE  [127,] -5.211279257 43.51605
FALSE  [128,] -5.177327840 43.50709
FALSE  [129,] -5.091079875 43.50399
FALSE  [130,] -5.067050334 43.49908
FALSE  [131,] -5.056482504 43.48636
FALSE  [132,] -5.044467733 43.49202
FALSE  [133,] -4.974523682 43.47644
FALSE  [134,] -4.966436321 43.47856
FALSE  [135,] -4.951992757 43.48781
FALSE  [136,] -4.940391398 43.48944
FALSE  [137,] -4.929668538 43.48719
FALSE  [138,] -4.906956747 43.47836
FALSE  [139,] -4.835953328 43.46753
FALSE  [140,] -4.754407919 43.43931
FALSE  [141,] -4.734460816 43.43482
FALSE  [142,] -4.507601278 43.42017
FALSE  [143,] -4.481142945 43.40131
FALSE  [144,] -4.460188151 43.41637
FALSE  [145,] -4.431972820 43.42030
FALSE  [146,] -4.404248413 43.41466
FALSE  [147,] -4.384869751 43.40131
FALSE  [148,] -4.378694418 43.40131
FALSE  [149,] -4.368126587 43.41384
FALSE  [150,] -4.358695638 43.41735
FALSE  [151,] -4.312212687 43.41348
FALSE  [152,] -4.187905030 43.42306
FALSE  [153,] -4.160361491 43.43885
FALSE  [154,] -4.097135376 43.45329
FALSE  [155,] -4.073364217 43.45593
FALSE  [156,] -4.028664103 43.45593
FALSE  [157,] -4.022772990 43.45861
FALSE  [158,] -4.021997844 43.46345
FALSE  [159,] -4.020344197 43.46815
FALSE  [160,] -4.012153484 43.47022
FALSE  [161,] -4.005047973 43.46851
FALSE  [162,] -3.980811727 43.45593
FALSE  [163,] -3.975850790 43.46063
FALSE  [164,] -3.971406616 43.46184
FALSE  [165,] -3.966497356 43.46192
FALSE  [166,] -3.960322022 43.46277
FALSE  [167,] -3.964843709 43.46453
FALSE  [168,] -3.973990438 43.47022
FALSE  [169,] -3.973990438 43.47644
FALSE  [170,] -3.939522258 43.49481
FALSE  [171,] -3.922210652 43.50029
FALSE  [172,] -3.905725871 43.49693
FALSE  [173,] -3.893168498 43.50259
FALSE  [174,] -3.890274617 43.50143
FALSE  [175,] -3.885236166 43.49693
FALSE  [176,] -3.856168172 43.51008
FALSE  [177,] -3.826040812 43.51471
FALSE  [178,] -3.796404379 43.51045
FALSE  [179,] -3.768524943 43.49693
FALSE  [180,] -3.812036499 43.48254
FALSE  [181,] -3.830433309 43.47373
FALSE  [182,] -3.843662476 43.46277
FALSE  [183,] -3.833172160 43.45365
FALSE  [184,] -3.828572958 43.45073
FALSE  [185,] -3.823198608 43.44851
FALSE  [186,] -3.826557577 43.44776
FALSE  [187,] -3.829425618 43.44779
FALSE  [188,] -3.830950074 43.44675
FALSE  [189,] -3.830640015 43.44231
FALSE  [190,] -3.819529582 43.44195
FALSE  [191,] -3.810563721 43.44311
FALSE  [192,] -3.795835938 43.44851
FALSE  [193,] -3.788988810 43.45352
FALSE  [194,] -3.775578777 43.46735
FALSE  [195,] -3.771703044 43.47022
FALSE  [196,] -3.762892213 43.46799
FALSE  [197,] -3.753564616 43.45820
FALSE  [198,] -3.744314534 43.45593
FALSE  [199,] -3.740102906 43.45998
FALSE  [200,] -3.742376669 43.46908
FALSE  [201,] -3.748293620 43.47841
FALSE  [202,] -3.754934042 43.48326
FALSE  [203,] -3.754934042 43.48944
FALSE  [204,] -3.740878052 43.48792
FALSE  [205,] -3.735167806 43.48652
FALSE  [206,] -3.728165650 43.48326
FALSE  [207,] -3.726537842 43.48828
FALSE  [208,] -3.725116740 43.48828
FALSE  [209,] -3.720724244 43.48944
FALSE  [210,] -3.728165650 43.49693
FALSE  [211,] -3.717313599 43.50045
FALSE  [212,] -3.687858033 43.50189
FALSE  [213,] -3.676385864 43.50714
FALSE  [214,] -3.666412313 43.51437
FALSE  [215,] -3.655508586 43.51838
FALSE  [216,] -3.578769083 43.53592
FALSE  [217,] -3.553809367 43.53463
FALSE  [218,] -3.555669718 43.51740
FALSE  [219,] -3.538487305 43.51662
FALSE  [220,] -3.524973918 43.50931
FALSE  [221,] -3.514121867 43.50091
FALSE  [222,] -3.504768433 43.49693
FALSE  [223,] -3.436038778 43.48817
FALSE  [224,] -3.430871135 43.48461
FALSE  [225,] -3.427641357 43.47941
FALSE  [226,] -3.426530314 43.47332
FALSE  [227,] -3.427951417 43.46453
FALSE  [228,] -3.432059692 43.46314
FALSE  [229,] -3.438286702 43.46420
FALSE  [230,] -3.446425740 43.46277
FALSE  [231,] -3.450559855 43.46536
FALSE  [232,] -3.460016643 43.46993
FALSE  [233,] -3.469370077 43.47187
FALSE  [234,] -3.473710897 43.46650
FALSE  [235,] -3.477224895 43.46079
FALSE  [236,] -3.485286418 43.45528
FALSE  [237,] -3.501021892 43.44851
FALSE  [238,] -3.481229818 43.44570
FALSE  [239,] -3.469886841 43.43446
FALSE  [240,] -3.460481730 43.43012
FALSE  [241,] -3.446425740 43.44851
FALSE  [242,] -3.435599528 43.43676
FALSE  [243,] -3.421621053 43.43583
FALSE  [244,] -3.391855428 43.44231
FALSE  [245,] -3.377489380 43.44030
FALSE  [246,] -3.329740356 43.42802
FALSE  [247,] -3.268297079 43.42180
FALSE  [248,] -3.222951009 43.40929
FALSE  [249,] -3.209954386 43.40753
FALSE  [250,] -3.199334880 43.40317
FALSE  [251,] -3.176390544 43.38389
FALSE  [252,] -3.130941122 43.37345
FALSE  [253,] -3.111820842 43.37180
FALSE  [254,] -3.088928182 43.38459
FALSE  [255,] -3.057302206 43.37002
FALSE  [256,] -3.007641154 43.33865
FALSE  [257,] -3.007641154 43.34606
FALSE  [258,] -3.019397542 43.37027
FALSE  [259,] -3.022885701 43.38270
FALSE  [260,] -3.028750977 43.38986
FALSE  [261,] -3.028725139 43.39389
FALSE  [262,] -3.023712524 43.39862
FALSE  [263,] -3.010276652 43.40187
FALSE  [264,] -2.998752807 43.41203
FALSE  [265,] -2.955344605 43.43154
FALSE  [266,] -2.939299072 43.43482
FALSE  [267,] -2.939299072 43.44231
FALSE  [268,] -2.946197876 43.44231
FALSE  [269,] -2.946197876 43.44851
FALSE  [270,] -2.929454712 43.45564
FALSE  [271,] -2.904650025 43.45758
FALSE  [272,] -2.853619547 43.45593
FALSE  [273,] -2.806438965 43.45939
FALSE  [274,] -2.785380819 43.46557
FALSE  [275,] -2.768017538 43.47022
FALSE  [276,] -2.755253458 43.46794
FALSE  [277,] -2.734272828 43.45647
FALSE  [278,] -2.714635783 43.44216
FALSE  [279,] -2.705902466 43.43141
FALSE  [280,] -2.694481975 43.40632
FALSE  [281,] -2.690502889 43.38529
FALSE  [282,] -2.686420451 43.38914
FALSE  [283,] -2.678668986 43.40753
FALSE  [284,] -2.677842164 43.41239
FALSE  [285,] -2.678203898 43.41823
FALSE  [286,] -2.677222046 43.42389
FALSE  [287,] -2.672416138 43.42802
FALSE  [288,] -2.660530558 43.42962
FALSE  [289,] -2.648748331 43.42725
FALSE  [290,] -2.637586223 43.42368
FALSE  [291,] -2.606321981 43.41957
FALSE  [292,] -2.548341024 43.40131
FALSE  [293,] -2.505449585 43.39485
FALSE  [294,] -2.482918661 43.38831
FALSE  [295,] -2.463746704 43.36691
FALSE  [296,] -2.366853393 43.33338
FALSE  [297,] -2.326545776 43.32451
FALSE  [298,] -2.284067749 43.32113
FALSE  [299,] -2.240401164 43.32498
FALSE  [300,] -2.207328247 43.33167
FALSE  [301,] -2.195752726 43.33237
FALSE  [302,] -2.189809937 43.32927
FALSE  [303,] -2.182885295 43.32219
FALSE  [304,] -2.173841919 43.31513
FALSE  [305,] -2.161594605 43.31193
FALSE  [306,] -2.159010783 43.31302
FALSE  [307,] -2.155651815 43.31539
FALSE  [308,] -2.150949260 43.31774
FALSE  [309,] -2.144231323 43.31878
FALSE  [310,] -2.139425415 43.31663
FALSE  [311,] -2.137203329 43.31193
FALSE  [312,] -2.134257772 43.30720
FALSE  [313,] -2.127178101 43.30514
FALSE  [314,] -2.098290976 43.32188
FALSE  [315,] -2.085836955 43.32498
FALSE  [316,] -2.064959677 43.32723
FALSE  [317,] -1.994007935 43.34606
FALSE  [318,] -1.971270305 43.35694
FALSE  [319,] -1.959746460 43.36077
FALSE  [320,] -1.944967001 43.36035
FALSE  [321,] -1.933029745 43.35332
FALSE  [322,] -1.925898397 43.34361
FALSE  [323,] -1.918095256 43.33870
FALSE  [324,] -1.903987589 43.34606
FALSE  [325,] -1.909620321 43.34898
FALSE  [326,] -1.918301961 43.35624
FALSE  [327,] -1.925071574 43.36035
FALSE  [328,] -1.884350546 43.37376
FALSE  [329,] -1.846678426 43.39862
FALSE  [330,] -1.810814983 43.41280
FALSE  [331,] -1.790764527 43.40224
FALSE  [332,] -1.796448934 43.37438
FALSE  [333,] -1.797172404 43.35332
FALSE  [334,] -1.796914022 43.34113
FALSE  [335,] -1.768233602 43.33092
FALSE  [336,] -1.755779582 43.31855
FALSE  [337,] -1.752420614 43.29909
FALSE  [338,] -1.747356324 43.29100
FALSE  [339,] -1.736555949 43.29232
FALSE  [340,] -1.724825399 43.29653
FALSE  [341,] -1.703328003 43.29862
FALSE  [342,] -1.683019166 43.30493
FALSE  [343,] -1.673872436 43.30415
FALSE  [344,] -1.654907186 43.29754
FALSE  [345,] -1.645036988 43.29237
FALSE  [346,] -1.645192016 43.28764
FALSE  [347,] -1.647982544 43.28155
FALSE  [348,] -1.646328898 43.27279
FALSE  [349,] -1.639042522 43.25568
FALSE  [350,] -1.634081583 43.25111
FALSE  [351,] -1.621885946 43.24700
FALSE  [352,] -1.611085571 43.24581
FALSE  [353,] -1.598476522 43.24700
FALSE  [354,] -1.587572795 43.25160
FALSE  [355,] -1.581888387 43.26036
FALSE  [356,] -1.573981893 43.27744
FALSE  [357,] -1.559047404 43.28408
FALSE  [358,] -1.539203654 43.28356
FALSE  [359,] -1.508094442 43.27677
FALSE  [360,] -1.466391561 43.26077
FALSE  [361,] -1.455281128 43.26222
FALSE  [362,] -1.444222372 43.26511
FALSE  [363,] -1.432233439 43.26501
FALSE  [364,] -1.403501343 43.24333
FALSE  [365,] -1.399677287 43.20674
FALSE  [366,] -1.410529337 43.16690
FALSE  [367,] -1.425773885 43.13528
FALSE  [368,] -1.438434611 43.12280
FALSE  [369,] -1.479620728 43.09026
FALSE  [370,] -1.487837280 43.08182
FALSE  [371,] -1.475279907 43.06014
FALSE  [372,] -1.457141480 43.04507
FALSE  [373,] -1.435023966 43.03572
FALSE  [374,] -1.410529337 43.03091
FALSE  [375,] -1.383140829 43.02921
FALSE  [376,] -1.366139282 43.03332
FALSE  [377,] -1.357612671 43.04683
FALSE  [378,] -1.355183879 43.07303
FALSE  [379,] -1.348259237 43.09308
FALSE  [380,] -1.331050985 43.10734
FALSE  [381,] -1.308623413 43.11357
FALSE  [382,] -1.286040812 43.10918
FALSE  [383,] -1.306969767 43.09598
FALSE  [384,] -1.315082968 43.08288
FALSE  [385,] -1.310587117 43.06949
FALSE  [386,] -1.293688925 43.05520
FALSE  [387,] -1.274878703 43.04683
FALSE  [388,] -1.216897746 43.03926
FALSE  [389,] -1.182532919 43.02528
FALSE  [390,] -1.149925089 43.00572
FALSE  [391,] -1.112407999 43.00825
FALSE  [392,] -1.103726359 43.00575
FALSE  [393,] -1.087189901 42.99800
FALSE  [394,] -1.079696818 42.99340
FALSE  [395,] -1.045073609 42.99022
FALSE  [396,] -1.028485474 42.98671
FALSE  [397,] -1.016289836 42.97624
FALSE  [398,] -0.981459920 42.95704
FALSE  [399,] -0.943219361 42.94790
FALSE  [400,] -0.863534302 42.94306
FALSE  [401,] -0.786433065 42.95327
FALSE  [402,] -0.759664673 42.94650
FALSE  [403,] -0.740906128 42.91090
FALSE  [404,] -0.741422893 42.90389
FALSE  [405,] -0.744781861 42.89929
FALSE  [406,] -0.745867065 42.89392
FALSE  [407,] -0.740286011 42.88480
FALSE  [408,] -0.730105753 42.87751
FALSE  [409,] -0.720287231 42.87661
FALSE  [410,] -0.710520386 42.87767
FALSE  [411,] -0.700391805 42.87643
FALSE  [412,] -0.666078655 42.86074
FALSE  [413,] -0.648301961 42.84979
FALSE  [414,] -0.609492961 42.81144
FALSE  [415,] -0.608046021 42.80718
FALSE  [416,] -0.609958049 42.80284
FALSE  [417,] -0.610164754 42.79909
FALSE  [418,] -0.603550171 42.79685
FALSE  [419,] -0.587323772 42.79685
FALSE  [420,] -0.582931274 42.79584
FALSE  [421,] -0.577143514 42.78979
FALSE  [422,] -0.578538778 42.78331
FALSE  [423,] -0.578693807 42.77734
FALSE  [424,] -0.569030314 42.77264
FALSE  [425,] -0.561175496 42.77354
FALSE  [426,] -0.544432332 42.78202
FALSE  [427,] -0.535647339 42.78421
FALSE  [428,] -0.533890340 42.80801
FALSE  [429,] -0.508413859 42.80749
FALSE  [430,] -0.454463664 42.78891
FALSE  [431,] -0.423922893 42.79067
FALSE  [432,] -0.399738322 42.80132
FALSE  [433,] -0.351679240 42.82925
FALSE  [434,] -0.342997600 42.82274
FALSE  [435,] -0.335168620 42.82496
FALSE  [436,] -0.328243978 42.83258
FALSE  [437,] -0.322792114 42.84250
FALSE  [438,] -0.307418376 42.83183
FALSE  [439,] -0.247034465 42.80483
FALSE  [440,] -0.235148885 42.78623
FALSE  [441,] -0.208354655 42.78388
FALSE  [442,] -0.179390015 42.78974
FALSE  [443,] -0.161406617 42.79535
FALSE  [444,] -0.163628703 42.77798
FALSE  [445,] -0.157789266 42.76070
FALSE  [446,] -0.145722819 42.74589
FALSE  [447,] -0.129238037 42.73589
FALSE  [448,] -0.123114380 42.73036
FALSE  [449,] -0.121822469 42.72331
FALSE  [450,] -0.119031942 42.71685
FALSE  [451,] -0.108489950 42.71336
FALSE  [452,] -0.095751709 42.71068
FALSE  [453,] -0.088852906 42.70613
FALSE  [454,] -0.084202027 42.70109
FALSE  [455,] -0.078414266 42.69667
FALSE  [456,] -0.038933471 42.68515
FALSE  [457,] -0.004310262 42.68752
FALSE  [458,]  0.072842651 42.70848
FALSE  [459,]  0.134182577 42.71522
FALSE  [460,]  0.152941121 42.72460
FALSE  [461,]  0.169167521 42.72646
FALSE  [462,]  0.222394246 42.71621
FALSE  [463,]  0.238362264 42.71037
FALSE  [464,]  0.259807983 42.68238
FALSE  [465,]  0.275388428 42.66869
FALSE  [466,]  0.290245402 42.67029
FALSE  [467,]  0.318305705 42.69954
FALSE  [468,]  0.336030721 42.71269
FALSE  [469,]  0.354169148 42.71750
FALSE  [470,]  0.381816040 42.70011
FALSE  [471,]  0.384012288 42.69685
FALSE  [472,]  0.383676392 42.69269
FALSE  [473,]  0.384399861 42.68858
FALSE  [474,]  0.389283284 42.68515
FALSE  [475,]  0.409282064 42.68225
FALSE  [476,]  0.428789917 42.68303
FALSE  [477,]  0.466927124 42.69044
FALSE  [478,]  0.483515259 42.68530
FALSE  [479,]  0.608158814 42.68799
FALSE  [480,]  0.643608846 42.68448
FALSE  [481,]  0.656734660 42.68799
FALSE  [482,]  0.665416300 42.69866
FALSE  [483,]  0.666449829 42.71476
FALSE  [484,]  0.659628540 42.72990
FALSE  [485,]  0.647639607 42.74104
FALSE  [486,]  0.633480265 42.74478
FALSE  [487,]  0.639578084 42.75483
FALSE  [488,]  0.643298787 42.75907
FALSE  [489,]  0.650740194 42.76339
FALSE  [490,]  0.639681437 42.77468
FALSE  [491,]  0.653737426 42.80269
FALSE  [492,]  0.651567017 42.82405
FALSE  [493,]  0.656321249 42.83842
FALSE  [494,]  0.679368937 42.84511
FALSE  [495,]  0.706757446 42.84658
FALSE  [496,]  0.724327433 42.84529
FALSE  [497,]  0.758847290 42.83527
FALSE  [498,]  0.776313924 42.83245
FALSE  [499,]  0.795744262 42.83385
FALSE  [500,]  0.812900838 42.83162
FALSE  [501,]  0.856102335 42.81276
FALSE  [502,]  0.885764608 42.80424
FALSE  [503,]  0.894446248 42.79933
FALSE  [504,]  0.910362590 42.78767
FALSE  [505,]  0.921111288 42.78437
FALSE  [506,]  0.930619751 42.78804
FALSE  [507,]  0.940024862 42.79367
FALSE  [508,]  0.950256795 42.79612
FALSE  [509,]  0.958731730 42.79372
FALSE  [510,]  0.975268189 42.78375
FALSE  [511,]  0.982916300 42.78036
FALSE  [512,]  1.068182414 42.77612
FALSE  [513,]  1.089059692 42.77132
FALSE  [514,]  1.106733032 42.75961
FALSE  [515,]  1.116551554 42.74525
FALSE  [516,]  1.124096313 42.72974
FALSE  [517,]  1.134328247 42.71597
FALSE  [518,]  1.151484822 42.70672
FALSE  [519,]  1.162543579 42.70569
FALSE  [520,]  1.195926554 42.71365
FALSE  [521,]  1.319123169 42.71336
FALSE  [522,]  1.342584269 42.70866
FALSE  [523,]  1.338243449 42.69445
FALSE  [524,]  1.343307740 42.69044
FALSE  [525,]  1.352712850 42.69006
FALSE  [526,]  1.361084432 42.68672
FALSE  [527,]  1.378757772 42.66324
FALSE  [528,]  1.397981404 42.64363
FALSE  [529,]  1.414827921 42.60934
FALSE  [530,]  1.429297323 42.59539
FALSE  [531,]  1.424853149 42.58937
FALSE  [532,]  1.419272094 42.57926
FALSE  [533,]  1.418031860 42.56983
FALSE  [534,]  1.426403442 42.56565
FALSE  [535,]  1.426300089 42.56180
FALSE  [536,]  1.409763631 42.54061
FALSE  [537,]  1.406456339 42.52924
FALSE  [538,]  1.428987264 42.53146
FALSE  [539,]  1.446557251 42.51989
FALSE  [540,]  1.449967895 42.50407
FALSE  [541,]  1.430227498 42.49356
FALSE  [542,]  1.424543091 42.49247
FALSE  [543,]  1.407593221 42.48676
FALSE  [544,]  1.436428670 42.45348
FALSE  [545,]  1.436428670 42.44095
FALSE  [546,]  1.447900838 42.43465
FALSE  [547,]  1.508465617 42.42868
FALSE  [548,]  1.516630493 42.42950
FALSE  [549,]  1.528206014 42.43423
FALSE  [550,]  1.534510539 42.43992
FALSE  [551,]  1.538851359 42.44565
FALSE  [552,]  1.544432414 42.45036
FALSE  [553,]  1.607477661 42.45643
FALSE  [554,]  1.639517049 42.46643
FALSE  [555,]  1.650369100 42.49340
FALSE  [556,]  1.653986450 42.49653
FALSE  [557,]  1.656983683 42.49764
FALSE  [558,]  1.659774211 42.49681
FALSE  [559,]  1.662358032 42.49371
FALSE  [560,]  1.674243612 42.49051
FALSE  [561,]  1.686335897 42.49061
FALSE  [562,]  1.697498006 42.49446
FALSE  [563,]  1.707006470 42.50278
FALSE  [564,]  1.710003702 42.50133
FALSE  [565,]  1.711967407 42.49929
FALSE  [566,]  1.712690878 42.49679
FALSE  [567,]  1.712174113 42.49371
FALSE  [568,]  1.730570923 42.48805
FALSE  [569,]  1.792685995 42.48172
FALSE  [570,]  1.813666626 42.47524
FALSE  [571,]  1.869787231 42.44679
FALSE  [572,]  1.893248332 42.44273
FALSE  [573,]  1.911955200 42.44196
FALSE  [574,]  1.927458130 42.43689
FALSE  [575,]  1.941100708 42.42010
FALSE  [576,]  1.954226522 42.38269
FALSE  [577,]  1.963734985 42.36723
FALSE  [578,]  1.983372030 42.35455
FALSE  [579,]  1.995671020 42.34868
FALSE  [580,]  2.009210246 42.34708
FALSE  [581,]  2.035255168 42.34925
FALSE  [582,]  2.051688273 42.35235
FALSE  [583,]  2.063263794 42.35791
FALSE  [584,]  2.080110311 42.37126
FALSE  [585,]  2.103984822 42.38483
FALSE  [586,]  2.108739054 42.39064
FALSE  [587,]  2.116283814 42.40540
FALSE  [588,]  2.121038045 42.41062
FALSE  [589,]  2.136954386 42.41622
FALSE  [590,]  2.184186645 42.41181
FALSE  [591,]  2.245991659 42.42612
FALSE  [592,]  2.277410930 42.42863
FALSE  [593,]  2.305316202 42.41697
FALSE  [594,]  2.317305135 42.40961
FALSE  [595,]  2.375492798 42.38933
FALSE  [596,]  2.406602010 42.38426
FALSE  [597,]  2.422518351 42.38369
FALSE  [598,]  2.429856404 42.36754
FALSE  [599,]  2.445566040 42.35196
FALSE  [600,]  2.464893026 42.34062
FALSE  [601,]  2.483393189 42.33698
FALSE  [602,]  2.503650350 42.32845
FALSE  [603,]  2.514812459 42.32566
FALSE  [604,]  2.525251098 42.32589
FALSE  [605,]  2.531969035 42.33078
FALSE  [606,]  2.540340617 42.34698
FALSE  [607,]  2.548092082 42.35225
FALSE  [608,]  2.567419067 42.35264
FALSE  [609,]  2.613411092 42.34096
FALSE  [610,]  2.635425252 42.33788
FALSE  [611,]  2.662193644 42.33902
FALSE  [612,]  2.661780232 42.34336
FALSE  [613,]  2.649377889 42.35372
FALSE  [614,]  2.640282837 42.37284
FALSE  [615,]  2.648241008 42.38147
FALSE  [616,]  2.690408976 42.40617
FALSE  [617,]  2.708082316 42.41289
FALSE  [618,]  2.728546183 42.41403
FALSE  [619,]  2.767716918 42.40956
FALSE  [620,]  2.788594197 42.41201
FALSE  [621,]  2.804613892 42.41956
FALSE  [622,]  2.834792928 42.44131
FALSE  [623,]  2.850812622 42.44837
FALSE  [624,]  2.866935669 42.44963
FALSE  [625,]  2.884092244 42.44919
FALSE  [626,]  2.900835409 42.45126
FALSE  [627,]  2.933701619 42.47023
FALSE  [628,]  2.966051066 42.46100
FALSE  [629,]  2.983104288 42.46932
FALSE  [630,]  2.993749634 42.46762
FALSE  [631,]  3.022998494 42.46705
FALSE  [632,]  3.029613078 42.46565
FALSE  [633,]  3.036020955 42.45462
FALSE  [634,]  3.043875773 42.44527
FALSE  [635,]  3.053590942 42.43764
FALSE  [636,]  3.065579875 42.43201
FALSE  [637,]  3.086147095 42.42718
FALSE  [638,]  3.111675252 42.42501
FALSE  [639,]  3.137823527 42.42594
FALSE  [640,]  3.205933065 42.43470
FALSE  [641,]  3.200662068 42.41212
FALSE  [642,]  3.200558715 42.40013
FALSE  [643,]  3.205623006 42.38664
FALSE  [644,]  3.223813110 42.36548
FALSE  [645,]  3.227947225 42.35610
FALSE  [646,]  3.237972453 42.34904
FALSE  [647,]  3.260193319 42.35202
FALSE  [648,]  3.283654419 42.35269
FALSE  [649,]  3.296676880 42.33873
FALSE  [650,]  3.303601522 42.33873
FALSE  [651,]  3.314246867 42.34628
FALSE  [652,]  3.327372680 42.34450
FALSE  [653,]  3.351350545 42.33246
FALSE  [654,]  3.327786092 42.29745
FALSE  [655,]  3.324065389 42.28750
FALSE  [656,]  3.320861450 42.27238
FALSE  [657,]  3.313006632 42.26515
FALSE  [658,]  3.304014933 42.25951
FALSE  [659,]  3.296676880 42.24933
FALSE  [660,]  3.280760538 42.25520
FALSE  [661,]  3.183195435 42.25817
FALSE  [662,]  3.170793091 42.25094
FALSE  [663,]  3.159630982 42.22949
FALSE  [664,]  3.151156046 42.19231
FALSE  [665,]  3.150019165 42.16784
FALSE  [666,]  3.156220337 42.15001
FALSE  [667,]  3.172343383 42.13712
FALSE  [668,]  3.206759888 42.12149
FALSE  [669,]  3.221022583 42.11278
FALSE  [670,]  3.233734986 42.09128
FALSE  [671,]  3.232804810 42.06857
FALSE  [672,]  3.228670695 42.04821
FALSE  [673,]  3.231667928 42.03397
FALSE  [674,]  3.235388631 42.02694
FALSE  [675,]  3.240659627 42.00617
FALSE  [676,]  3.241486450 41.99950
FALSE  [677,]  3.245620565 41.99410
FALSE  [678,]  3.264327434 41.98250
FALSE  [679,]  3.269495076 41.97498
FALSE  [680,]  3.265877726 41.95553
FALSE  [681,]  3.241176392 41.92339
FALSE  [682,]  3.228670695 41.89775
FALSE  [683,]  3.212340942 41.88478
FALSE  [684,]  3.138030232 41.84969
FALSE  [685,]  3.085733683 41.80810
FALSE  [686,]  2.951581665 41.73399
FALSE  [687,]  2.913237752 41.72174
FALSE  [688,]  2.882335246 41.71813
FALSE  [689,]  2.872206665 41.71490
FALSE  [690,]  2.864971964 41.70960
FALSE  [691,]  2.858770793 41.70280
FALSE  [692,]  2.851536092 41.69691
FALSE  [693,]  2.840890747 41.69446
FALSE  [694,]  2.836136516 41.69231
FALSE  [695,]  2.820840292 41.68172
FALSE  [696,]  2.817636353 41.67738
FALSE  [697,]  2.813708943 41.66999
FALSE  [698,]  2.804303832 41.66849
FALSE  [699,]  2.792624960 41.66878
FALSE  [700,]  2.782186320 41.66712
FALSE  [701,]  2.652478474 41.60506
FALSE  [702,]  2.450113566 41.53499
FALSE  [703,]  2.429649699 41.51871
FALSE  [704,]  2.371978800 41.48899
FALSE  [705,]  2.297254679 41.46512
FALSE  [706,]  2.267799112 41.44838
FALSE  [707,]  2.241030721 41.42073
FALSE  [708,]  2.192454874 41.35649
FALSE  [709,]  2.163722778 41.32642
FALSE  [710,]  2.131166626 41.30342
FALSE  [711,]  2.060990031 41.27433
FALSE  [712,]  2.020269002 41.26560
FALSE  [713,]  1.951952759 41.26043
FALSE  [714,]  1.884773397 41.24725
FALSE  [715,]  1.864412883 41.23790
FALSE  [716,]  1.854594360 41.23578
FALSE  [717,]  1.820487915 41.23692
FALSE  [718,]  1.630835408 41.19785
FALSE  [719,]  1.545879354 41.19315
FALSE  [720,]  1.294731893 41.12199
FALSE  [721,]  1.224245239 41.11041
FALSE  [722,]  1.216700480 41.10566
FALSE  [723,]  1.199130493 41.08173
FALSE  [724,]  1.195306437 41.07403
FALSE  [725,]  1.190242146 41.06830
FALSE  [726,]  1.179596801 41.06442
FALSE  [727,]  1.155722290 41.07538
FALSE  [728,]  1.148177531 41.07749
FALSE  [729,]  1.104149210 41.07662
FALSE  [730,]  1.062291301 41.07067
FALSE  [731,]  1.024050740 41.05750
FALSE  [732,]  0.990977824 41.03941
FALSE  [733,]  0.878013143 40.95456
FALSE  [734,]  0.823339478 40.89931
FALSE  [735,]  0.732905721 40.83291
FALSE  [736,]  0.713475382 40.80376
FALSE  [737,]  0.740140422 40.79203
FALSE  [738,]  0.768769165 40.78325
FALSE  [739,]  0.781068156 40.78376
FALSE  [740,]  0.785822388 40.78873
FALSE  [741,]  0.782205038 40.79606
FALSE  [742,]  0.768769165 40.80376
FALSE  [743,]  0.785512329 40.80273
FALSE  [744,]  0.799258260 40.79720
FALSE  [745,]  0.810627075 40.78893
FALSE  [746,]  0.834604940 40.76614
FALSE  [747,]  0.860546508 40.74981
FALSE  [748,]  0.874292440 40.73860
FALSE  [749,]  0.880907023 40.73488
FALSE  [750,]  0.888658488 40.73292
FALSE  [751,]  0.895066366 40.73038
FALSE  [752,]  0.897753540 40.72491
FALSE  [753,]  0.894652954 40.71695
FALSE  [754,]  0.887935017 40.71255
FALSE  [755,]  0.881113729 40.70909
FALSE  [756,]  0.870985148 40.69478
FALSE  [757,]  0.854965454 40.68713
FALSE  [758,]  0.790576620 40.67271
FALSE  [759,]  0.762981404 40.65395
FALSE  [760,]  0.713475382 40.60512
FALSE  [761,]  0.692598103 40.58894
FALSE  [762,]  0.666656534 40.57463
FALSE  [763,]  0.641541789 40.57380
FALSE  [764,]  0.624075154 40.59830
FALSE  [765,]  0.659938599 40.59349
FALSE  [766,]  0.692598103 40.60486
FALSE  [767,]  0.740760538 40.63923
FALSE  [768,]  0.719159790 40.64786
FALSE  [769,]  0.688877400 40.64594
FALSE  [770,]  0.606505167 40.62543
FALSE  [771,]  0.586661417 40.61535
FALSE  [772,]  0.570124959 40.60181
FALSE  [773,]  0.555242147 40.58398
FALSE  [774,]  0.508009887 40.49588
FALSE  [775,]  0.490026489 40.47681
FALSE  [776,]  0.472663207 40.46244
FALSE  [777,]  0.459201497 40.44585
FALSE  [778,]  0.452845296 40.42017
FALSE  [779,]  0.426929565 40.40002
FALSE  [780,]  0.357192220 40.29661
FALSE  [781,]  0.345435831 40.28612
FALSE  [782,]  0.318615763 40.26927
FALSE  [783,]  0.305438273 40.25847
FALSE  [784,]  0.271280151 40.22147
FALSE  [785,]  0.223892863 40.18328
FALSE  [786,]  0.151080770 40.09058
FALSE  [787,]  0.123666423 40.06805
FALSE  [788,]  0.060802042 40.03766
FALSE  [789,]  0.035041341 40.00862
FALSE  [790,] -0.008185995 39.93772
FALSE  [791,] -0.034075887 39.90754
FALSE  [792,] -0.096681885 39.85364
FALSE  [793,] -0.199905559 39.72119
FALSE  [794,] -0.205202393 39.71070
FALSE  [795,] -0.207579509 39.68657
FALSE  [796,] -0.214374959 39.66978
FALSE  [797,] -0.225149496 39.65717
FALSE  [798,] -0.249101522 39.63681
FALSE  [799,] -0.262795777 39.62192
FALSE  [800,] -0.275017253 39.60441
FALSE  [801,] -0.280314087 39.58751
FALSE  [802,] -0.286876994 39.57510
FALSE  [803,] -0.318089559 39.53976
FALSE  [804,] -0.328709066 39.52203
FALSE  [805,] -0.335607869 39.48173
FALSE  [806,] -0.333850871 39.43718
FALSE  [807,] -0.326099406 39.39388
FALSE  [808,] -0.300726278 39.32179
FALSE  [809,] -0.247964641 39.21244
FALSE  [810,] -0.235045533 39.19404
FALSE  [811,] -0.232487549 39.18686
FALSE  [812,] -0.235924032 39.17606
FALSE  [813,] -0.249876669 39.16650
FALSE  [814,] -0.252951417 39.15549
FALSE  [815,] -0.249437419 39.13823
FALSE  [816,] -0.218870809 39.09069
FALSE  [817,] -0.194686239 39.04209
FALSE  [818,] -0.157375855 39.00191
FALSE  [819,] -0.120091309 38.95085
FALSE  [820,] -0.105337687 38.93631
FALSE  [821,] -0.068078979 38.91313
FALSE  [822,] -0.030406861 38.88254
FALSE  [823,] -0.009167847 38.86946
FALSE  [824,]  0.017962280 38.86409
FALSE  [825,]  0.063721761 38.86055
FALSE  [826,]  0.111470784 38.84967
FALSE  [827,]  0.154491414 38.83076
FALSE  [828,]  0.185859009 38.80327
FALSE  [829,]  0.181621541 38.80166
FALSE  [830,]  0.171596314 38.79582
FALSE  [831,]  0.183481893 38.79159
FALSE  [832,]  0.191440063 38.78500
FALSE  [833,]  0.206400390 38.76787
FALSE  [834,]  0.216296427 38.76999
FALSE  [835,]  0.222600952 38.75766
FALSE  [836,]  0.223169392 38.74203
FALSE  [837,]  0.216296427 38.73438
FALSE  [838,]  0.197615397 38.73345
FALSE  [839,]  0.180691365 38.73014
FALSE  [840,]  0.165240113 38.72374
FALSE  [841,]  0.151080770 38.71325
FALSE  [842,]  0.139453572 38.69221
FALSE  [843,]  0.137489868 38.68968
FALSE  [844,]  0.133459106 38.68612
FALSE  [845,]  0.114287150 38.68529
FALSE  [846,]  0.107026611 38.68258
FALSE  [847,]  0.093874959 38.67227
FALSE  [848,]  0.082221923 38.66741
FALSE  [849,]  0.071654094 38.66069
FALSE  [850,]  0.061732218 38.64503
FALSE  [851,]  0.069173624 38.63074
FALSE  [852,]  0.049123168 38.63465
FALSE  [853,]  0.035273885 38.63198
FALSE  [854,]  0.022044718 38.62713
FALSE  [855,]  0.003699585 38.62449
FALSE  [856,] -0.026066040 38.62418
FALSE  [857,] -0.040147868 38.62043
FALSE  [858,] -0.054333049 38.61149
FALSE  [859,] -0.066115276 38.59506
FALSE  [860,] -0.066399496 38.58051
FALSE  [861,] -0.064978394 38.56674
FALSE  [862,] -0.071412110 38.55251
FALSE  [863,] -0.086785848 38.53966
FALSE  [864,] -0.101591146 38.53512
FALSE  [865,] -0.143113159 38.53512
FALSE  [866,] -0.188330038 38.52698
FALSE  [867,] -0.213496460 38.51938
FALSE  [868,] -0.245329142 38.50137
FALSE  [869,] -0.340775513 38.46980
FALSE  [870,] -0.355890869 38.46137
FALSE  [871,] -0.362195394 38.44982
FALSE  [872,] -0.370076050 38.44574
FALSE  [873,] -0.406559611 38.41355
FALSE  [874,] -0.417515015 38.39864
FALSE  [875,] -0.421545777 38.37905
FALSE  [876,] -0.421287394 38.36874
FALSE  [877,] -0.425111450 38.36453
FALSE  [878,] -0.457254192 38.36314
FALSE  [879,] -0.471568563 38.35980
FALSE  [880,] -0.481903849 38.35167
FALSE  [881,] -0.485727905 38.33650
FALSE  [882,] -0.521177938 38.33815
FALSE  [883,] -0.530169637 38.29844
FALSE  [884,] -0.527327433 38.21299
FALSE  [885,] -0.538851277 38.20129
FALSE  [886,] -0.556214559 38.19788
FALSE  [887,] -0.592233032 38.20000
FALSE  [888,] -0.614712281 38.19545
FALSE  [889,] -0.632850708 38.18377
FALSE  [890,] -0.647010051 38.16816
FALSE  [891,] -0.657655396 38.15155
FALSE  [892,] -0.664114950 38.13741
FALSE  [893,] -0.668300741 38.12181
FALSE  [894,] -0.671297973 38.07956
FALSE  [895,] -0.663908244 38.00755
FALSE  [896,] -0.665923625 37.98910
FALSE  [897,] -0.674760295 37.98003
FALSE  [898,] -0.689333048 37.97190
FALSE  [899,] -0.708246623 37.95603
FALSE  [900,] -0.717910116 37.94275
FALSE  [901,] -0.758011027 37.86312
FALSE  [902,] -0.760078084 37.84681
FALSE  [903,] -0.755530558 37.80581
FALSE  [904,] -0.760078084 37.79591
FALSE  [905,] -0.787363241 37.82258
FALSE  [906,] -0.811806193 37.76987
FALSE  [907,] -0.824983683 37.76113
FALSE  [908,] -0.847307902 37.75589
FALSE  [909,] -0.855524455 37.74227
FALSE  [910,] -0.852010458 37.72349
FALSE  [911,] -0.819195923 37.67651
FALSE  [912,] -0.809325724 37.66664
FALSE  [913,] -0.777079631 37.64985
FALSE  [914,] -0.754135294 37.64106
FALSE  [915,] -0.734291545 37.63912
FALSE  [916,] -0.725919962 37.65129
FALSE  [917,] -0.707471476 37.64277
FALSE  [918,] -0.700650187 37.63109
FALSE  [919,] -0.704732625 37.61926
FALSE  [920,] -0.719150350 37.61034
FALSE  [921,] -0.727315226 37.60316
FALSE  [922,] -0.736048543 37.59920
FALSE  [923,] -0.745040243 37.59920
FALSE  [924,] -0.753876913 37.60406
FALSE  [925,] -0.763437052 37.59936
FALSE  [926,] -0.790980591 37.59119
FALSE  [927,] -0.807362020 37.58825
FALSE  [928,] -0.835784058 37.57616
FALSE  [929,] -0.873352824 37.57616
FALSE  [930,] -0.886116903 37.57404
FALSE  [931,] -0.900121216 37.56882
FALSE  [932,] -0.924564168 37.55567
FALSE  [933,] -0.933142457 37.56086
FALSE  [934,] -0.972984986 37.57616
FALSE  [935,] -1.005747844 37.58120
FALSE  [936,] -1.069413208 37.58236
FALSE  [937,] -1.087189901 37.58070
FALSE  [938,] -1.102692830 37.57616
FALSE  [939,] -1.114113322 37.56846
FALSE  [940,] -1.119332641 37.55885
FALSE  [941,] -1.116283732 37.54913
FALSE  [942,] -1.102692830 37.54143
FALSE  [943,] -1.124810344 37.54365
FALSE  [944,] -1.175039836 37.55567
FALSE  [945,] -1.179949096 37.55781
FALSE  [946,] -1.184910035 37.56251
FALSE  [947,] -1.191679647 37.56722
FALSE  [948,] -1.228369914 37.57580
FALSE  [949,] -1.239945435 37.57616
FALSE  [950,] -1.295135865 37.56417
FALSE  [951,] -1.340714478 37.56086
FALSE  [952,] -1.358594524 37.55567
FALSE  [953,] -1.374614217 37.54717
FALSE  [954,] -1.419107626 37.51234
FALSE  [955,] -1.435747437 37.50381
FALSE  [956,] -1.455539510 37.50043
FALSE  [957,] -1.460913859 37.49841
FALSE  [958,] -1.468923706 37.49368
FALSE  [959,] -1.476261759 37.48805
FALSE  [960,] -1.479517375 37.48335
FALSE  [961,] -1.482101197 37.47851
FALSE  [962,] -1.492694865 37.44552
FALSE  [963,] -1.493728394 37.43901
FALSE  [964,] -1.502306681 37.43358
FALSE  [965,] -1.508197794 37.43498
FALSE  [966,] -1.513572144 37.43844
FALSE  [967,] -1.520445109 37.43901
FALSE  [968,] -1.529230103 37.43436
FALSE  [969,] -1.549073853 37.42071
FALSE  [970,] -1.558323934 37.41787
FALSE  [971,] -1.573051717 37.41565
FALSE  [972,] -1.624056356 37.39805
FALSE  [973,] -1.676197876 37.36899
FALSE  [974,] -1.685551310 37.36015
FALSE  [975,] -1.691080688 37.34273
FALSE  [976,] -1.704413208 37.32212
FALSE  [977,] -1.733972128 37.28814
FALSE  [978,] -1.792676555 37.24098
FALSE  [979,] -1.818204712 37.21274
FALSE  [980,] -1.835774699 37.17210
FALSE  [981,] -1.843216106 37.13735
FALSE  [982,] -1.855308390 37.11016
FALSE  [983,] -1.860579386 37.08231
FALSE  [984,] -1.890345012 37.02126
FALSE  [985,] -1.911428996 36.99335
FALSE  [986,] -1.912255819 36.98100
FALSE  [987,] -1.909516968 36.97211
FALSE  [988,] -1.905796264 36.96446
FALSE  [989,] -1.903987589 36.95578
FALSE  [990,] -1.905744589 36.94689
FALSE  [991,] -1.910550496 36.94173
FALSE  [992,] -1.918301961 36.93930
FALSE  [993,] -1.940677857 36.93800
FALSE  [994,] -1.946723999 36.93563
FALSE  [995,] -1.959281372 36.92568
FALSE  [996,] -1.994214640 36.90625
FALSE  [997,] -2.008218953 36.89279
FALSE  [998,] -2.018450887 36.85150
FALSE  [999,] -2.030078085 36.83951
FALSE [1000,] -2.045787720 36.83005
FALSE [1001,] -2.062375854 36.81584
FALSE [1002,] -2.066148234 36.80825
FALSE [1003,] -2.071264201 36.78928
FALSE [1004,] -2.076586873 36.78106
FALSE [1005,] -2.085733602 36.77636
FALSE [1006,] -2.096792359 36.77404
FALSE [1007,] -2.106197469 36.77093
FALSE [1008,] -2.116377726 36.75187
FALSE [1009,] -2.132035686 36.74215
FALSE [1010,] -2.152086141 36.73564
FALSE [1011,] -2.171516479 36.73326
FALSE [1012,] -2.209033569 36.74282
FALSE [1013,] -2.237093872 36.76582
FALSE [1014,] -2.261536825 36.79310
FALSE [1015,] -2.288253540 36.81584
FALSE [1016,] -2.323703573 36.83362
FALSE [1017,] -2.344580852 36.84003
FALSE [1018,] -2.367060099 36.84251
FALSE [1019,] -2.385663615 36.83951
FALSE [1020,] -2.418116415 36.82576
FALSE [1021,] -2.438425253 36.82204
FALSE [1022,] -2.447623657 36.82401
FALSE [1023,] -2.474857137 36.83346
FALSE [1024,] -2.486846069 36.83569
FALSE [1025,] -2.572112183 36.82447
FALSE [1026,] -2.588286906 36.81708
FALSE [1027,] -2.614073445 36.78478
FALSE [1028,] -2.634537313 36.74014
FALSE [1029,] -2.660065471 36.71874
FALSE [1030,] -2.664974731 36.71590
FALSE [1031,] -2.676188517 36.70660
FALSE [1032,] -2.701820028 36.69776
FALSE [1033,] -2.729570272 36.69378
FALSE [1034,] -2.747501994 36.69910
FALSE [1035,] -2.767914185 36.69213
FALSE [1036,] -2.788274699 36.70029
FALSE [1037,] -2.807911744 36.71301
FALSE [1038,] -2.826411906 36.71967
FALSE [1039,] -2.835326091 36.71745
FALSE [1040,] -2.844446981 36.70810
FALSE [1041,] -2.853619547 36.70598
FALSE [1042,] -2.864135702 36.71073
FALSE [1043,] -2.891524211 36.74014
FALSE [1044,] -2.913357503 36.75011
FALSE [1045,] -2.932632813 36.75140
FALSE [1046,] -2.970330770 36.74696
FALSE [1047,] -3.227343506 36.76060
FALSE [1048,] -3.329016887 36.75063
FALSE [1049,] -3.343796346 36.74267
FALSE [1050,] -3.357697307 36.73166
FALSE [1051,] -3.378135335 36.71967
FALSE [1052,] -3.421517700 36.70649
FALSE [1053,] -3.458259644 36.70727
FALSE [1054,] -3.607501180 36.74205
FALSE [1055,] -3.618327392 36.75037
FALSE [1056,] -3.628946900 36.75461
FALSE [1057,] -3.692793132 36.74014
FALSE [1058,] -3.736898967 36.73735
FALSE [1059,] -3.813948527 36.75703
FALSE [1060,] -3.857356730 36.76060
FALSE [1061,] -3.957712362 36.73833
FALSE [1062,] -4.056052612 36.74778
FALSE [1063,] -4.080753947 36.74598
FALSE [1064,] -4.196405803 36.71523
FALSE [1065,] -4.224156047 36.71218
FALSE [1066,] -4.402594768 36.72370
FALSE [1067,] -4.419596314 36.71967
FALSE [1068,] -4.432670451 36.71042
FALSE [1069,] -4.460575724 36.67125
FALSE [1070,] -4.466363485 36.66278
FALSE [1071,] -4.479876872 36.65094
FALSE [1072,] -4.490496379 36.63647
FALSE [1073,] -4.494837199 36.62030
FALSE [1074,] -4.501891032 36.61151
FALSE [1075,] -4.622529663 36.55043
FALSE [1076,] -4.641882487 36.51757
FALSE [1077,] -4.649246379 36.51188
FALSE [1078,] -4.658599813 36.50739
FALSE [1079,] -4.679709635 36.50051
FALSE [1080,] -4.722187663 36.49281
FALSE [1081,] -4.763606324 36.49374
FALSE [1082,] -4.888094849 36.51245
FALSE [1083,] -4.910315715 36.51328
FALSE [1084,] -4.919927531 36.51080
FALSE [1085,] -4.931244670 36.50356
FALSE [1086,] -5.001912190 36.47323
FALSE [1087,] -5.070099244 36.45896
FALSE [1088,] -5.116504679 36.43576
FALSE [1089,] -5.128829508 36.43225
FALSE [1090,] -5.165287232 36.42868
FALSE [1091,] -5.181410278 36.42419
FALSE [1092,] -5.194277710 36.41798
FALSE [1093,] -5.207403524 36.40393
FALSE [1094,] -5.234792033 36.36460
FALSE [1095,] -5.253602254 36.34931
FALSE [1096,] -5.270345418 36.31277
FALSE [1097,] -5.279285442 36.29789
FALSE [1098,] -5.284246379 36.29329
FALSE [1099,] -5.291584432 36.28786
FALSE [1100,] -5.299697632 36.28332
FALSE [1101,] -5.316182414 36.27820
FALSE [1102,] -5.315148885 36.27060
FALSE [1103,] -5.310963094 36.26156
FALSE [1104,] -5.310342977 36.25407
FALSE [1105,] -5.355043091 36.19883
FALSE [1106,] -5.359745646 36.18854
FALSE [1107,] -5.364499878 36.14110
FALSE [1108,] -5.385118774 36.14110
FALSE [1109,] -5.392301799 36.15790
FALSE [1110,] -5.408166463 36.16710
FALSE [1111,] -5.431730916 36.17397
FALSE [1112,] -5.451057903 36.17449
FALSE [1113,] -5.454313518 36.16472
FALSE [1114,] -5.463563599 36.15624
FALSE [1115,] -5.468059448 36.14358
FALSE [1116,] -5.467180949 36.12927
FALSE [1117,] -5.460566366 36.11630
FALSE [1118,] -5.465630656 36.10901
FALSE [1119,] -5.462840129 36.09945
FALSE [1120,] -5.457310750 36.08974
FALSE [1121,] -5.454313518 36.08157
FALSE [1122,] -5.457517457 36.07031
FALSE [1123,] -5.464338745 36.06359
FALSE [1124,] -5.471108358 36.05821
FALSE [1125,] -5.474157268 36.05144
FALSE [1126,] -5.592186239 36.02235
FALSE [1127,] -5.606655640 36.01481
FALSE [1128,] -5.619471395 36.01315
FALSE [1129,] -5.655386515 36.03749
FALSE [1130,] -5.697347779 36.05671
FALSE [1131,] -5.714969442 36.06793
FALSE [1132,] -5.738792277 36.06069
FALSE [1133,] -5.759566203 36.06643
FALSE [1134,] -5.779306600 36.07630
FALSE [1135,] -5.821681275 36.08627
FALSE [1136,] -5.836874146 36.09754
FALSE [1137,] -5.858474894 36.12312
FALSE [1138,] -5.923535523 36.17469
FALSE [1139,] -5.942810832 36.18482
FALSE [1140,] -5.964618286 36.18461
FALSE [1141,] -6.009215048 36.17774
FALSE [1142,] -6.050401164 36.19030
FALSE [1143,] -6.076187703 36.21795
FALSE [1144,] -6.095876425 36.25148
FALSE [1145,] -6.118459025 36.28140
FALSE [1146,] -6.167138225 36.31107
FALSE [1147,] -6.173752807 36.32548
FALSE [1148,] -6.176284953 36.34207
FALSE [1149,] -6.182951213 36.36026
FALSE [1150,] -6.191942912 36.37747
FALSE [1151,] -6.214163778 36.40920
FALSE [1152,] -6.237831584 36.45323
FALSE [1153,] -6.264910034 36.48320
FALSE [1154,] -6.287337606 36.51803
FALSE [1155,] -6.309041707 36.53276
FALSE [1156,] -6.317723348 36.54092
FALSE [1157,] -6.305424357 36.54552
FALSE [1158,] -6.297104452 36.54397
FALSE [1159,] -6.265271770 36.52051
FALSE [1160,] -6.256641805 36.51142
FALSE [1161,] -6.261809448 36.50299
FALSE [1162,] -6.254419718 36.49338
FALSE [1163,] -6.239175171 36.47943
FALSE [1164,] -6.226772827 36.48170
FALSE [1165,] -6.219176391 36.48728
FALSE [1166,] -6.208479370 36.50051
FALSE [1167,] -6.186981975 36.52025
FALSE [1168,] -6.194216675 36.52092
FALSE [1169,] -6.214525513 36.51560
FALSE [1170,] -6.232043823 36.51757
FALSE [1171,] -6.240157023 36.53291
FALSE [1172,] -6.233749146 36.56340
FALSE [1173,] -6.242637492 36.58247
FALSE [1174,] -6.282583374 36.61218
FALSE [1175,] -6.293177042 36.61663
FALSE [1176,] -6.361079875 36.62030
FALSE [1177,] -6.379166626 36.62402
FALSE [1178,] -6.394101115 36.63668
FALSE [1179,] -6.406348430 36.67647
FALSE [1180,] -6.416993775 36.69569
FALSE [1181,] -6.430946412 36.71430
FALSE [1182,] -6.437250936 36.73306
FALSE [1183,] -6.432651733 36.75099
FALSE [1184,] -6.413893189 36.76742
FALSE [1185,] -6.395651408 36.77486
FALSE [1186,] -6.358237671 36.78556
FALSE [1187,] -6.345008504 36.79476
FALSE [1188,] -6.334569865 36.81801
FALSE [1189,] -6.343096477 36.85972
FALSE [1190,] -6.337567098 36.88349
FALSE [1191,] -6.303822387 36.90700
FALSE [1192,] -6.222690389 36.90217
FALSE [1193,] -6.194216675 36.93188
FALSE [1194,] -6.213388632 36.92137
FALSE [1195,] -6.239071818 36.91320
FALSE [1196,] -6.264496623 36.91274
FALSE [1197,] -6.282945109 36.92568
FALSE [1198,] -6.325319784 36.91248
FALSE [1199,] -6.344026653 36.90100
FALSE [1200,] -6.351881470 36.88008
FALSE [1201,] -6.346093709 36.81967
FALSE [1202,] -6.351881470 36.80840
FALSE [1203,] -6.387383179 36.80788
FALSE [1204,] -6.415650187 36.83749
FALSE [1205,] -6.448051311 36.90395
FALSE [1206,] -6.470478882 36.93537
FALSE [1207,] -6.498952596 36.95942
FALSE [1208,] -6.744260620 37.10110
FALSE [1209,] -6.770822307 37.11257
FALSE [1210,] -6.794076701 37.11748
FALSE [1211,] -6.811129924 37.12347
FALSE [1212,] -6.852471069 37.15086
FALSE [1213,] -6.872624878 37.15843
FALSE [1214,] -6.892261922 37.16631
FALSE [1215,] -6.910245320 37.18876
FALSE [1216,] -6.916963257 37.21489
FALSE [1217,] -6.910141968 37.22734
FALSE [1218,] -6.898101360 37.23551
FALSE [1219,] -6.863478149 37.27731
FALSE [1220,] -6.852161011 37.29499
FALSE [1221,] -6.902855591 37.24936
FALSE [1222,] -6.930554159 37.23370
FALSE [1223,] -6.961973430 37.23354
FALSE [1224,] -6.961973430 37.22734
FALSE [1225,] -6.940114299 37.20042
FALSE [1226,] -6.929468954 37.18293
FALSE [1227,] -6.927866984 37.17210
FALSE [1228,] -6.941044475 37.17081
FALSE [1229,] -7.028842733 37.20528
FALSE [1230,] -7.061088827 37.21370
FALSE [1231,] -7.140205445 37.21990
FALSE [1232,] -7.126717896 37.21442
FALSE [1233,] -7.098347534 37.21163
FALSE [1234,] -7.084911662 37.20626
FALSE [1235,] -7.327274129 37.20130
FALSE [1236,] -7.342467001 37.19597
FALSE [1237,] -7.362310751 37.18150
FALSE [1238,] -7.380759237 37.17970
FALSE [1239,] -7.397864136 37.18517
FALSE [1240,] -7.413832153 37.19261
FALSE [1241,] -7.429386760 37.23675
FALSE [1242,] -7.434244344 37.25933
FALSE [1243,] -7.427578085 37.27452
FALSE [1244,] -7.437448283 37.30734
FALSE [1245,] -7.444993042 37.38676
FALSE [1246,] -7.462252971 37.41787
FALSE [1247,] -7.460030884 37.42914
FALSE [1248,] -7.462924764 37.45113
FALSE [1249,] -7.468867554 37.47557
FALSE [1250,] -7.475947225 37.49425
FALSE [1251,] -7.481476603 37.50037
FALSE [1252,] -7.498633179 37.51166
FALSE [1253,] -7.506332968 37.51812
FALSE [1254,] -7.515428019 37.52934
FALSE [1255,] -7.517546753 37.53518
FALSE [1256,] -7.518425253 37.54195
FALSE [1257,] -7.523670411 37.55567
FALSE [1258,] -7.527597819 37.55551
FALSE [1259,] -7.529122274 37.55670
FALSE [1260,] -7.529690714 37.56717
FALSE [1261,] -7.526486776 37.57120
FALSE [1262,] -7.515841431 37.58094
FALSE [1263,] -7.514652873 37.58587
FALSE [1264,] -7.512534139 37.59037
FALSE [1265,] -7.511758993 37.59528
FALSE [1266,] -7.514342814 37.60140
FALSE [1267,] -7.504886027 37.60639
FALSE [1268,] -7.478479370 37.62887
FALSE [1269,] -7.471606405 37.63690
FALSE [1270,] -7.466335409 37.65197
FALSE [1271,] -7.457550415 37.70008
FALSE [1272,] -7.444011190 37.73015
FALSE [1273,] -7.426337850 37.75062
FALSE [1274,] -7.334405477 37.81193
FALSE [1275,] -7.306861939 37.85077
FALSE [1276,] -7.295803182 37.88487
FALSE [1277,] -7.273892375 37.93154
FALSE [1278,] -7.268621379 37.94924
FALSE [1279,] -7.269086466 37.95944
FALSE [1280,] -7.272135377 37.96895
FALSE [1281,] -7.272703817 37.97701
FALSE [1282,] -7.265830851 37.98295
FALSE [1283,] -7.234049846 37.98807
FALSE [1284,] -7.223301148 37.99383
FALSE [1285,] -7.210330363 37.99303
FALSE [1286,] -7.197617961 37.98993
FALSE [1287,] -7.185267293 37.98869
FALSE [1288,] -7.172864950 37.99383
FALSE [1289,] -7.159739136 37.99680
FALSE [1290,] -7.152246054 38.00065
FALSE [1291,] -7.141910767 38.01158
FALSE [1292,] -7.131988891 38.03238
FALSE [1293,] -7.123255575 38.04000
FALSE [1294,] -7.105943970 38.03866
FALSE [1295,] -7.049358277 38.02021
FALSE [1296,] -7.023985149 38.02256
FALSE [1297,] -7.015768595 38.04683
FALSE [1298,] -7.006363485 38.05933
FALSE [1299,] -6.997630168 38.08961
FALSE [1300,] -6.978974976 38.11995
FALSE [1301,] -6.965487427 38.15333
FALSE [1302,] -6.957632609 38.16816
FALSE [1303,] -6.947504029 38.19664
FALSE [1304,] -6.964195516 38.20614
FALSE [1305,] -6.992100790 38.20428
FALSE [1306,] -7.018145711 38.19803
FALSE [1307,] -7.021039592 38.19824
FALSE [1308,] -7.026413940 38.19963
FALSE [1309,] -7.038712932 38.18622
FALSE [1310,] -7.063052531 38.17754
FALSE [1311,] -7.088322307 38.17338
FALSE [1312,] -7.103515178 38.17359
FALSE [1313,] -7.126872925 38.19090
FALSE [1314,] -7.167180542 38.27208
FALSE [1315,] -7.172399862 38.27653
FALSE [1316,] -7.189453084 38.28653
FALSE [1317,] -7.196326050 38.29216
FALSE [1318,] -7.200666870 38.29839
FALSE [1319,] -7.207126424 38.31169
FALSE [1320,] -7.211363892 38.31753
FALSE [1321,] -7.317145548 38.42458
FALSE [1322,] -7.345515910 38.44096
FALSE [1323,] -7.359210164 38.44636
FALSE [1324,] -7.344844117 38.45833
FALSE [1325,] -7.335180623 38.46944
FALSE [1326,] -7.334095419 38.48101
FALSE [1327,] -7.345619263 38.49414
FALSE [1328,] -7.335800741 38.50587
FALSE [1329,] -7.317713989 38.55625
FALSE [1330,] -7.275856080 38.60382
FALSE [1331,] -7.270430054 38.61770
FALSE [1332,] -7.273530640 38.62540
FALSE [1333,] -7.279421753 38.62891
FALSE [1334,] -7.286036337 38.63191
FALSE [1335,] -7.290945598 38.63816
FALSE [1336,] -7.292495891 38.64612
FALSE [1337,] -7.292960979 38.65627
FALSE [1338,] -7.290945598 38.67909
FALSE [1339,] -7.284072632 38.71325
FALSE [1340,] -7.280713664 38.72043
FALSE [1341,] -7.272187052 38.73374
FALSE [1342,] -7.270430054 38.73751
FALSE [1343,] -7.211518921 38.77536
FALSE [1344,] -7.196429403 38.77999
FALSE [1345,] -7.179737915 38.79089
FALSE [1346,] -7.166198690 38.80342
FALSE [1347,] -7.160617635 38.81290
FALSE [1348,] -7.151005819 38.81929
FALSE [1349,] -7.104858765 38.82719
FALSE [1350,] -7.088684042 38.83337
FALSE [1351,] -7.076540080 38.84324
FALSE [1352,] -7.064292766 38.85112
FALSE [1353,] -7.056076212 38.85515
FALSE [1354,] -7.057264771 38.86944
FALSE [1355,] -7.052200481 38.88499
FALSE [1356,] -7.066049764 38.90460
FALSE [1357,] -7.044500692 38.91863
FALSE [1358,] -7.022124797 38.94287
FALSE [1359,] -6.988638469 38.99377
FALSE [1360,] -6.978819946 39.00382
FALSE [1361,] -6.973290568 39.01395
FALSE [1362,] -6.974892538 39.02302
FALSE [1363,] -6.986313029 39.03007
FALSE [1364,] -6.979388387 39.04718
FALSE [1365,] -6.985692912 39.06676
FALSE [1366,] -6.999697225 39.08470
FALSE [1367,] -7.015768595 39.09681
FALSE [1368,] -7.038816285 39.10914
FALSE [1369,] -7.064912882 39.11477
FALSE [1370,] -7.091267863 39.11245
FALSE [1371,] -7.115194052 39.10110
FALSE [1372,] -7.127286336 39.09749
FALSE [1373,] -7.142530884 39.09953
FALSE [1374,] -7.157206991 39.10544
FALSE [1375,] -7.167490601 39.11348
FALSE [1376,] -7.168885865 39.12185
FALSE [1377,] -7.157930460 39.14138
FALSE [1378,] -7.155811727 39.15151
FALSE [1379,] -7.168059041 39.17063
FALSE [1380,] -7.191571819 39.17916
FALSE [1381,] -7.219322063 39.18484
FALSE [1382,] -7.244126750 39.19564
FALSE [1383,] -7.258079387 39.21130
FALSE [1384,] -7.265779175 39.23135
FALSE [1385,] -7.264332234 39.25233
FALSE [1386,] -7.250844686 39.27063
FALSE [1387,] -7.300454061 39.31791
FALSE [1388,] -7.319264283 39.32954
FALSE [1389,] -7.326654012 39.34132
FALSE [1390,] -7.331408244 39.36261
FALSE [1391,] -7.331925008 39.38473
FALSE [1392,] -7.326705689 39.39884
FALSE [1393,] -7.318850871 39.41325
FALSE [1394,] -7.313631551 39.43610
FALSE [1395,] -7.313528198 39.45744
FALSE [1396,] -7.320917928 39.46741
FALSE [1397,] -7.362930867 39.47609
FALSE [1398,] -7.384169882 39.48400
FALSE [1399,] -7.399414429 39.49366
FALSE [1400,] -7.408922892 39.51557
FALSE [1401,] -7.417552856 39.52420
FALSE [1402,] -7.451349243 39.53785
FALSE [1403,] -7.468092407 39.55025
FALSE [1404,] -7.497858032 39.58105
FALSE [1405,] -7.515841431 39.59376
FALSE [1406,] -7.548242554 39.66321
FALSE [1407,] -7.557285930 39.67980
FALSE [1408,] -7.341433472 39.67184
FALSE [1409,] -7.327842570 39.67479
FALSE [1410,] -7.311409465 39.68032
FALSE [1411,] -7.292754273 39.68332
FALSE [1412,] -7.252860067 39.68233
FALSE [1413,] -7.235755168 39.68652
FALSE [1414,] -7.214051066 39.67618
FALSE [1415,] -7.182890177 39.67510
FALSE [1416,] -7.035767375 39.68926
FALSE [1417,] -7.021142945 39.69401
FALSE [1418,] -7.009619100 39.71546
FALSE [1419,] -7.010704305 39.72280
FALSE [1420,] -7.013649862 39.72962
FALSE [1421,] -7.013339804 39.73892
FALSE [1422,] -7.008740601 39.74832
FALSE [1423,] -6.996803345 39.76471
FALSE [1424,] -6.993030966 39.77421
FALSE [1425,] -6.994581258 39.78259
FALSE [1426,] -6.998870402 39.79178
FALSE [1427,] -7.000265666 39.80253
FALSE [1428,] -6.993030966 39.81607
FALSE [1429,] -6.985227824 39.82114
FALSE [1430,] -6.962335165 39.82853
FALSE [1431,] -6.952826701 39.83287
FALSE [1432,] -6.927660279 39.86191
FALSE [1433,] -6.924249634 39.87157
FALSE [1434,] -6.923474488 39.88832
FALSE [1435,] -6.921769165 39.89715
FALSE [1436,] -6.921562460 39.90217
FALSE [1437,] -6.925128133 39.91224
FALSE [1438,] -6.925231486 39.91793
FALSE [1439,] -6.922285929 39.92242
FALSE [1440,] -6.912570760 39.92811
FALSE [1441,] -6.909521851 39.93198
FALSE [1442,] -6.903682414 39.95668
FALSE [1443,] -6.899755005 39.96562
FALSE [1444,] -6.901615357 39.97648
FALSE [1445,] -6.896912801 39.98712
FALSE [1446,] -6.879704549 40.00919
FALSE [1447,] -6.919908814 40.06489
FALSE [1448,] -6.942129680 40.08634
FALSE [1449,] -6.955720581 40.10293
FALSE [1450,] -6.966417603 40.11032
FALSE [1451,] -6.977166301 40.11342
FALSE [1452,] -7.003676311 40.11631
FALSE [1453,] -7.015768595 40.11905
FALSE [1454,] -7.027654175 40.13264
FALSE [1455,] -7.034837199 40.16675
FALSE [1456,] -7.043105428 40.18137
FALSE [1457,] -7.034578817 40.19305
FALSE [1458,] -7.024760295 40.21620
FALSE [1459,] -7.015768595 40.22550
FALSE [1460,] -6.997785197 40.23171
FALSE [1461,] -6.954687052 40.25336
FALSE [1462,] -6.935411743 40.25584
FALSE [1463,] -6.915826375 40.25444
FALSE [1464,] -6.896447713 40.25548
FALSE [1465,] -6.878050904 40.26524
FALSE [1466,] -6.875105347 40.27124
FALSE [1467,] -6.873865113 40.28777
FALSE [1468,] -6.870196086 40.29553
FALSE [1469,] -6.863943237 40.30095
FALSE [1470,] -6.820793417 40.32534
FALSE [1471,] -6.811956747 40.33232
FALSE [1472,] -6.794438436 40.35640
FALSE [1473,] -6.828079794 40.38059
FALSE [1474,] -6.851282512 40.40952
FALSE [1475,] -6.857121948 40.44213
FALSE [1476,] -6.838673462 40.47722
FALSE [1477,] -6.815315714 40.50254
FALSE [1478,] -6.812525187 40.51463
FALSE [1479,] -6.818054566 40.53189
FALSE [1480,] -6.828544881 40.54554
FALSE [1481,] -6.839758668 40.55458
FALSE [1482,] -6.848388631 40.56476
FALSE [1483,] -6.850455689 40.58223
FALSE [1484,] -6.844461222 40.59778
FALSE [1485,] -6.821310181 40.63018
FALSE [1486,] -6.814282186 40.64718
FALSE [1487,] -6.814230510 40.65933
FALSE [1488,] -6.816245890 40.67716
FALSE [1489,] -6.824307414 40.71069
FALSE [1490,] -6.836968140 40.74330
FALSE [1491,] -6.839138550 40.75751
FALSE [1492,] -6.839138550 40.77689
FALSE [1493,] -6.837278198 40.78676
FALSE [1494,] -6.834539348 40.79224
FALSE [1495,] -6.833505819 40.79782
FALSE [1496,] -6.836813111 40.80831
FALSE [1497,] -6.838053345 40.81493
FALSE [1498,] -6.836658081 40.84025
FALSE [1499,] -6.820328329 40.84423
FALSE [1500,] -6.816194214 40.85684
FALSE [1501,] -6.821155152 40.87006
FALSE [1502,] -6.832058878 40.87590
FALSE [1503,] -6.847045044 40.87890
FALSE [1504,] -6.855261597 40.88722
FALSE [1505,] -6.863633179 40.90831
FALSE [1506,] -6.885182251 40.94892
FALSE [1507,] -6.899238241 40.96675
FALSE [1508,] -6.930605835 40.99207
FALSE [1509,] -6.940424357 41.00339
FALSE [1510,] -6.942491415 41.01600
FALSE [1511,] -6.931794393 41.02912
FALSE [1512,] -6.927866984 41.04793
FALSE [1513,] -6.906834677 41.05610
FALSE [1514,] -6.845288046 41.05191
FALSE [1515,] -6.818002890 41.05414
FALSE [1516,] -6.804360311 41.06442
FALSE [1517,] -6.764776164 41.10886
FALSE [1518,] -6.756507935 41.12705
FALSE [1519,] -6.758988403 41.15175
FALSE [1520,] -6.755216024 41.15883
FALSE [1521,] -6.742245239 41.17144
FALSE [1522,] -6.706950237 41.19433
FALSE [1523,] -6.701265829 41.20245
FALSE [1524,] -6.693772746 41.21738
FALSE [1525,] -6.658219361 41.25784
FALSE [1526,] -6.646643840 41.26761
FALSE [1527,] -6.628918823 41.26994
FALSE [1528,] -6.563496460 41.27071
FALSE [1529,] -6.554453084 41.27562
FALSE [1530,] -6.495852011 41.29495
FALSE [1531,] -6.463140828 41.31412
FALSE [1532,] -6.430998088 41.33903
FALSE [1533,] -6.399578817 41.37748
FALSE [1534,] -6.395496378 41.37841
FALSE [1535,] -6.383197388 41.37655
FALSE [1536,] -6.379166626 41.37748
FALSE [1537,] -6.376737834 41.38300
FALSE [1538,] -6.375549276 41.39081
FALSE [1539,] -6.376169393 41.39685
FALSE [1540,] -6.379166626 41.39732
FALSE [1541,] -6.366247519 41.40517
FALSE [1542,] -6.352346558 41.40926
FALSE [1543,] -6.321133993 41.41101
FALSE [1544,] -6.321030640 41.41959
FALSE [1545,] -6.282945109 41.46564
FALSE [1546,] -6.282480022 41.47230
FALSE [1547,] -6.285167196 41.47897
FALSE [1548,] -6.285890666 41.48687
FALSE [1549,] -6.279534465 41.49700
FALSE [1550,] -6.253644572 41.51752
FALSE [1551,] -6.205947225 41.57028
FALSE [1552,] -6.216127482 41.58010
FALSE [1553,] -6.230080119 41.59490
FALSE [1554,] -6.272248088 41.62824
FALSE [1555,] -6.317103231 41.65015
FALSE [1556,] -6.365937459 41.66361
FALSE [1557,] -6.447069458 41.67624
FALSE [1558,] -6.460815389 41.67655
FALSE [1559,] -6.467740031 41.67206
FALSE [1560,] -6.474354614 41.66593
FALSE [1561,] -6.488048869 41.65880
FALSE [1562,] -6.503035034 41.65309
FALSE [1563,] -6.513421998 41.65092
FALSE [1564,] -6.541533977 41.65891
FALSE [1565,] -6.555279907 41.67490
FALSE [1566,] -6.560499227 41.69446
FALSE [1567,] -6.563083048 41.71304
FALSE [1568,] -6.567682251 41.72244
FALSE [1569,] -6.574348511 41.73105
FALSE [1570,] -6.577397420 41.73973
FALSE [1571,] -6.571506307 41.74921
FALSE [1572,] -6.564374960 41.75750
FALSE [1573,] -6.560137492 41.76688
FALSE [1574,] -6.535746216 41.84858
FALSE [1575,] -6.524222371 41.86742
FALSE [1576,] -6.550060588 41.87388
FALSE [1577,] -6.567888957 41.87587
FALSE [1578,] -6.575795451 41.88290
FALSE [1579,] -6.567630575 41.92607
FALSE [1580,] -6.571661337 41.94261
FALSE [1581,] -6.585148886 41.95465
FALSE [1582,] -6.609488485 41.96232
FALSE [1583,] -6.622821004 41.94096
FALSE [1584,] -6.656772420 41.93307
FALSE [1585,] -6.727982544 41.93085
FALSE [1586,] -6.757903198 41.93757
FALSE [1587,] -6.794386760 41.97971
FALSE [1588,] -6.824927531 41.98377
FALSE [1589,] -6.831232056 41.95395
FALSE [1590,] -6.854951538 41.94294
FALSE [1591,] -6.917118287 41.93909
FALSE [1592,] -6.945126913 41.94336
FALSE [1593,] -6.969518188 41.95770
FALSE [1594,] -6.992359172 41.96638
FALSE [1595,] -7.015768595 41.95367
FALSE [1596,] -7.051270305 41.94201
FALSE [1597,] -7.082741252 41.95279
FALSE [1598,] -7.113178670 41.97243
FALSE [1599,] -7.145373087 41.98749
FALSE [1600,] -7.159739136 41.98573
FALSE [1601,] -7.177309122 41.97837
FALSE [1602,] -7.192605346 41.96961
FALSE [1603,] -7.199943401 41.96372
FALSE [1604,] -7.202113811 41.94974
FALSE [1605,] -7.195654257 41.91737
FALSE [1606,] -7.197928019 41.90150
FALSE [1607,] -7.218650269 41.87905
FALSE [1608,] -7.251464803 41.86370
FALSE [1609,] -7.322468221 41.84541
FALSE [1610,] -7.340503296 41.84321
FALSE [1611,] -7.376831828 41.84404
FALSE [1612,] -7.391921346 41.84205
FALSE [1613,] -7.405408895 41.83520
FALSE [1614,] -7.429541789 41.81450
FALSE [1615,] -7.442719279 41.80595
FALSE [1616,] -7.446956747 41.82184
FALSE [1617,] -7.456568563 41.83923
FALSE [1618,] -7.469384318 41.85254
FALSE [1619,] -7.483285278 41.85621
FALSE [1620,] -7.493000447 41.85690
FALSE [1621,] -7.508141643 41.86494
FALSE [1622,] -7.515841431 41.86499
FALSE [1623,] -7.523282837 41.86016
FALSE [1624,] -7.525246542 41.85416
FALSE [1625,] -7.526331746 41.84737
FALSE [1626,] -7.531551066 41.84016
FALSE [1627,] -7.546692261 41.83205
FALSE [1628,] -7.567104451 41.82660
FALSE [1629,] -7.588395141 41.82422
FALSE [1630,] -7.606068481 41.82554
FALSE [1631,] -7.622191528 41.83233
FALSE [1632,] -7.622811646 41.84174
FALSE [1633,] -7.607360392 41.87318
FALSE [1634,] -7.661155558 41.87491
FALSE [1635,] -7.678673869 41.88135
FALSE [1636,] -7.706372437 41.89626
FALSE [1637,] -7.722030396 41.89925
FALSE [1638,] -7.750142375 41.88837
FALSE [1639,] -7.812154094 41.87713
FALSE [1640,] -7.839232544 41.87838
FALSE [1641,] -7.849722860 41.87577
FALSE [1642,] -7.854425416 41.87026
FALSE [1643,] -7.857887736 41.86378
FALSE [1644,] -7.864812378 41.85789
FALSE [1645,] -7.896593384 41.85794
FALSE [1646,] -7.903362997 41.88682
FALSE [1647,] -7.906101847 41.91385
FALSE [1648,] -7.925790568 41.90817
FALSE [1649,] -7.930493123 41.89667
FALSE [1650,] -7.935350708 41.87995
FALSE [1651,] -7.944755819 41.86695
FALSE [1652,] -7.963359334 41.86662
FALSE [1653,] -7.979430705 41.86861
FALSE [1654,] -7.993641724 41.86367
FALSE [1655,] -8.005889038 41.85396
FALSE [1656,] -8.015707560 41.84189
FALSE [1657,] -8.048573771 41.81639
FALSE [1658,] -8.093480591 41.80673
FALSE [1659,] -8.179573527 41.81070
FALSE [1660,] -8.175387736 41.83659
FALSE [1661,] -8.177041382 41.84985
FALSE [1662,] -8.184586141 41.85773
FALSE [1663,] -8.220397909 41.86819
FALSE [1664,] -8.231715048 41.88605
FALSE [1665,] -8.230216431 41.90468
FALSE [1666,] -8.220707967 41.92271
FALSE [1667,] -8.182131510 41.96542
FALSE [1668,] -8.152960165 41.98682
FALSE [1669,] -8.123918010 42.00090
FALSE [1670,] -8.108027506 42.01090
FALSE [1671,] -8.097356324 42.02348
FALSE [1672,] -8.095082561 42.04092
FALSE [1673,] -8.103195760 42.05581
FALSE [1674,] -8.118440307 42.06686
FALSE [1675,] -8.137612264 42.07291
FALSE [1676,] -8.158386190 42.07139
FALSE [1677,] -8.176162883 42.06526
FALSE [1678,] -8.191304077 42.06208
FALSE [1679,] -8.204016479 42.06955
FALSE [1680,] -8.207375448 42.08578
FALSE [1681,] -8.204326538 42.12880
FALSE [1682,] -8.213395752 42.14402
FALSE [1683,] -8.222361613 42.15363
FALSE [1684,] -8.252333944 42.13758
FALSE [1685,] -8.270679077 42.13200
FALSE [1686,] -8.287835652 42.13143
FALSE [1687,] -8.295380412 42.13009
FALSE [1688,] -8.304268758 42.12583
FALSE [1689,] -8.329951945 42.10844
FALSE [1690,] -8.346746786 42.10169
FALSE [1691,] -8.501207641 42.08309
FALSE [1692,] -8.520017863 42.07772
FALSE [1693,] -8.554434367 42.06007
FALSE [1694,] -8.572805338 42.05441
FALSE [1695,] -8.609418091 42.05366
FALSE [1696,] -8.626884725 42.05103
FALSE [1697,] -8.643886271 42.04149
FALSE [1698,] -8.652567912 42.03144
FALSE [1699,] -8.663213257 42.00989
FALSE [1700,] -8.670809693 41.99981
FALSE [1701,] -8.691273560 41.98961
FALSE [1702,] -8.717008423 41.98377
FALSE [1703,] -8.739591024 41.97511
FALSE [1704,] -8.750184693 41.96878
FALSE [1705,] -8.761398478 41.95232
FALSE [1706,] -8.776487997 41.93687
FALSE [1707,] -8.794729777 41.92545
FALSE [1708,] -8.815452027 41.92096
FALSE [1709,] -8.832195190 41.91370
FALSE [1710,] -8.848111532 41.89925
FALSE [1711,] -8.864079550 41.88868
FALSE [1712,] -8.880512655 41.89305
FALSE [1713,] -8.878032186 41.90687
FALSE [1714,] -8.897875936 42.10146
FALSE [1715,] -8.894930380 42.11880
FALSE [1716,] -8.883974976 42.12583
FALSE [1717,] -8.844339152 42.12634
FALSE [1718,] -8.825942342 42.13025
FALSE [1719,] -8.818449260 42.13950
FALSE [1720,] -8.823151815 42.14735
FALSE [1721,] -8.842065389 42.15415
FALSE [1722,] -8.846406210 42.16058
FALSE [1723,] -8.841445272 42.16404
FALSE [1724,] -8.815452027 42.17425
FALSE [1725,] -8.812919881 42.17849
FALSE [1726,] -8.810387736 42.18787
FALSE [1727,] -8.805116740 42.19724
FALSE [1728,] -8.794574748 42.20153
FALSE [1729,] -8.790104737 42.20425
FALSE [1730,] -8.771268677 42.22200
FALSE [1731,] -8.718920451 42.25202
FALSE [1732,] -8.705794637 42.25613
FALSE [1733,] -8.701247111 42.25833
FALSE [1734,] -8.669311076 42.28065
FALSE [1735,] -8.651431031 42.28605
FALSE [1736,] -8.631173869 42.29659
FALSE [1737,] -8.624559286 42.30163
FALSE [1738,] -8.620993612 42.30995
FALSE [1739,] -8.620993612 42.34054
FALSE [1740,] -8.622078817 42.34721
FALSE [1741,] -8.625851196 42.34811
FALSE [1742,] -8.634171102 42.34615
FALSE [1743,] -8.649312297 42.33532
FALSE [1744,] -8.660138510 42.31654
FALSE [1745,] -8.674194499 42.29879
FALSE [1746,] -8.698973348 42.29088
FALSE [1747,] -8.719282186 42.28739
FALSE [1748,] -8.773284058 42.26874
FALSE [1749,] -8.784291138 42.25985
FALSE [1750,] -8.795143188 42.25796
FALSE [1751,] -8.847646444 42.26078
FALSE [1752,] -8.866870077 42.25613
FALSE [1753,] -8.863046021 42.26874
FALSE [1754,] -8.852762411 42.29086
FALSE [1755,] -8.852607381 42.30458
FALSE [1756,] -8.846406210 42.30458
FALSE [1757,] -8.832453573 42.28889
FALSE [1758,] -8.826562460 42.29644
FALSE [1759,] -8.825942342 42.32876
FALSE [1760,] -8.827906047 42.33698
FALSE [1761,] -8.829973104 42.34140
FALSE [1762,] -8.826665812 42.34393
FALSE [1763,] -8.812299764 42.34615
FALSE [1764,] -8.776281291 42.33990
FALSE [1765,] -8.771268677 42.34240
FALSE [1766,] -8.764085653 42.35548
FALSE [1767,] -8.726284343 42.38852
FALSE [1768,] -8.709308635 42.40013
FALSE [1769,] -8.676235718 42.41622
FALSE [1770,] -8.661921346 42.42658
FALSE [1771,] -8.654583293 42.44111
FALSE [1772,] -8.663730021 42.43775
FALSE [1773,] -8.671843221 42.43816
FALSE [1774,] -8.681920125 42.44111
FALSE [1775,] -8.690653442 42.44041
FALSE [1776,] -8.693805705 42.43940
FALSE [1777,] -8.696234497 42.43775
FALSE [1778,] -8.718196981 42.42775
FALSE [1779,] -8.743053345 42.41299
FALSE [1780,] -8.757057658 42.40700
FALSE [1781,] -8.778658407 42.40258
FALSE [1782,] -8.810439412 42.40046
FALSE [1783,] -8.842995565 42.40341
FALSE [1784,] -8.866870077 42.41441
FALSE [1785,] -8.875138306 42.42576
FALSE [1786,] -8.879634156 42.44472
FALSE [1787,] -8.887385620 42.45537
FALSE [1788,] -8.900304728 42.46074
FALSE [1789,] -8.934772909 42.46519
FALSE [1790,] -8.942007609 42.46904
FALSE [1791,] -8.934411174 42.47886
FALSE [1792,] -8.916117717 42.48741
FALSE [1793,] -8.895395467 42.49366
FALSE [1794,] -8.880512655 42.49635
FALSE [1795,] -8.868420369 42.49320
FALSE [1796,] -8.860203817 42.48477
FALSE [1797,] -8.860513875 42.47534
FALSE [1798,] -8.873691366 42.46904
FALSE [1799,] -8.864906373 42.46475
FALSE [1800,] -8.850902059 42.46054
FALSE [1801,] -8.836380981 42.45865
FALSE [1802,] -8.825942342 42.46160
FALSE [1803,] -8.821911581 42.47211
FALSE [1804,] -8.824547079 42.48389
FALSE [1805,] -8.824495402 42.49472
FALSE [1806,] -8.812299764 42.50255
FALSE [1807,] -8.824547079 42.53717
FALSE [1808,] -8.825942342 42.55441
FALSE [1809,] -8.822376669 42.56926
FALSE [1810,] -8.813333293 42.58117
FALSE [1811,] -8.800930949 42.58906
FALSE [1812,] -8.787753458 42.59195
FALSE [1813,] -8.774886027 42.60453
FALSE [1814,] -8.738118245 42.66577
FALSE [1815,] -8.730340942 42.68812
FALSE [1816,] -8.736542114 42.68812
FALSE [1817,] -8.743466756 42.67220
FALSE [1818,] -8.753285279 42.65667
FALSE [1819,] -8.766669474 42.64492
FALSE [1820,] -8.784291138 42.64034
FALSE [1821,] -8.803204712 42.64569
FALSE [1822,] -8.815348674 42.65828
FALSE [1823,] -8.825580608 42.67391
FALSE [1824,] -8.838964803 42.68812
FALSE [1825,] -8.854054321 42.66130
FALSE [1826,] -8.856379761 42.64890
FALSE [1827,] -8.846406210 42.64034
FALSE [1828,] -8.868110311 42.61722
FALSE [1829,] -8.879892537 42.61161
FALSE [1830,] -8.894206909 42.61991
FALSE [1831,] -8.888832560 42.63037
FALSE [1832,] -8.902836874 42.62525
FALSE [1833,] -8.935806438 42.60624
FALSE [1834,] -8.921647095 42.59345
FALSE [1835,] -8.933325969 42.58650
FALSE [1836,] -8.969292765 42.57890
FALSE [1837,] -8.972134969 42.57363
FALSE [1838,] -8.980144816 42.55100
FALSE [1839,] -8.988568075 42.54867
FALSE [1840,] -8.996526245 42.54317
FALSE [1841,] -9.010892293 42.53048
FALSE [1842,] -9.025826782 42.54283
FALSE [1843,] -9.027945516 42.56120
FALSE [1844,] -9.032751424 42.57784
FALSE [1845,] -9.055230673 42.58515
FALSE [1846,] -9.070191000 42.59588
FALSE [1847,] -9.065100871 42.62006
FALSE [1848,] -9.050838176 42.64569
FALSE [1849,] -9.038177449 42.66086
FALSE [1850,] -9.038849243 42.67277
FALSE [1851,] -9.035645305 42.69362
FALSE [1852,] -9.029547485 42.71347
FALSE [1853,] -9.018152832 42.72546
FALSE [1854,] -9.013372762 42.73253
FALSE [1855,] -9.005672974 42.73961
FALSE [1856,] -8.993787394 42.74274
FALSE [1857,] -8.991358602 42.74478
FALSE [1858,] -8.962419800 42.75703
FALSE [1859,] -8.936736614 42.78349
FALSE [1860,] -8.921698771 42.79382
FALSE [1861,] -8.897565877 42.79798
FALSE [1862,] -8.890692912 42.80506
FALSE [1863,] -8.884285034 42.82075
FALSE [1864,] -8.887075562 42.83679
FALSE [1865,] -8.907849488 42.84519
FALSE [1866,] -8.911983602 42.82237
FALSE [1867,] -8.927486532 42.80824
FALSE [1868,] -8.950379191 42.80083
FALSE [1869,] -8.976785848 42.79798
FALSE [1870,] -9.027480429 42.80362
FALSE [1871,] -9.048357706 42.80052
FALSE [1872,] -9.045050416 42.78375
FALSE [1873,] -9.068020589 42.76545
FALSE [1874,] -9.080655477 42.76060
FALSE [1875,] -9.099620728 42.76328
FALSE [1876,] -9.112849894 42.77183
FALSE [1877,] -9.119516154 42.78470
FALSE [1878,] -9.124838826 42.80075
FALSE [1879,] -9.134398967 42.81852
FALSE [1880,] -9.121944946 42.81837
FALSE [1881,] -9.112643189 42.82204
FALSE [1882,] -9.105563518 42.82907
FALSE [1883,] -9.099620728 42.83899
FALSE [1884,] -9.107682251 42.85059
FALSE [1885,] -9.121634888 42.85751
FALSE [1886,] -9.140600138 42.86315
FALSE [1887,] -9.141788697 42.87108
FALSE [1888,] -9.146904664 42.88428
FALSE [1889,] -9.148041545 42.89020
FALSE [1890,] -9.146000326 42.89413
FALSE [1891,] -9.136879435 42.90178
FALSE [1892,] -9.134398967 42.90787
FALSE [1893,] -9.133107055 42.91689
FALSE [1894,] -9.133882203 42.92332
FALSE [1895,] -9.140858521 42.92712
FALSE [1896,] -9.157963420 42.92836
FALSE [1897,] -9.167316854 42.93257
FALSE [1898,] -9.182871460 42.95102
FALSE [1899,] -9.195273804 42.95503
FALSE [1900,] -9.195273804 42.94885
FALSE [1901,] -9.189382691 42.93813
FALSE [1902,] -9.195170451 42.93234
FALSE [1903,] -9.204523885 42.93043
FALSE [1904,] -9.209510661 42.93146
FALSE [1905,] -9.213722290 42.94472
FALSE [1906,] -9.223540812 42.94596
FALSE [1907,] -9.234961304 42.94064
FALSE [1908,] -9.243642945 42.93456
FALSE [1909,] -9.251136027 42.92599
FALSE [1910,] -9.261109579 42.90588
FALSE [1911,] -9.267827515 42.89702
FALSE [1912,] -9.272478393 42.89904
FALSE [1913,] -9.282348592 42.92239
FALSE [1914,] -9.291391968 42.92836
FALSE [1915,] -9.291391968 42.93456
FALSE [1916,] -9.284829061 42.94410
FALSE [1917,] -9.264158488 42.98606
FALSE [1918,] -9.263331665 42.99221
FALSE [1919,] -9.261264608 43.00024
FALSE [1920,] -9.258112345 43.00807
FALSE [1921,] -9.254184937 43.01371
FALSE [1922,] -9.250360881 43.02254
FALSE [1923,] -9.256665405 43.02905
FALSE [1924,] -9.271548218 43.03699
FALSE [1925,] -9.278937947 43.06071
FALSE [1926,] -9.270463013 43.06616
FALSE [1927,] -9.257337199 43.06662
FALSE [1928,] -9.250360881 43.07546
FALSE [1929,] -9.245089884 43.09378
FALSE [1930,] -9.233333496 43.10220
FALSE [1931,] -9.221783814 43.10843
FALSE [1932,] -9.216926229 43.12019
FALSE [1933,] -9.202301799 43.11075
FALSE [1934,] -9.189175985 43.10807
FALSE [1935,] -9.176256877 43.11132
FALSE [1936,] -9.161684123 43.12019
FALSE [1937,] -9.156413127 43.12548
FALSE [1938,] -9.153674276 43.13042
FALSE [1939,] -9.149746867 43.13533
FALSE [1940,] -9.140600138 43.14065
FALSE [1941,] -9.132486939 43.14372
FALSE [1942,] -9.125148886 43.14535
FALSE [1943,] -9.107062134 43.14685
FALSE [1944,] -9.107062134 43.15427
FALSE [1945,] -9.124115357 43.14827
FALSE [1946,] -9.146465414 43.14442
FALSE [1947,] -9.162769328 43.14551
FALSE [1948,] -9.161684123 43.15427
FALSE [1949,] -9.193620158 43.14230
FALSE [1950,] -9.207779500 43.14365
FALSE [1951,] -9.216926229 43.16117
FALSE [1952,] -9.169487264 43.19447
FALSE [1953,] -9.137292847 43.20729
FALSE [1954,] -9.099775757 43.19527
FALSE [1955,] -9.082567505 43.19548
FALSE [1956,] -9.064584106 43.19809
FALSE [1957,] -9.051820028 43.20207
FALSE [1958,] -9.039159302 43.21034
FALSE [1959,] -9.026343547 43.22186
FALSE [1960,] -9.016059936 43.23560
FALSE [1961,] -9.010892293 43.25051
FALSE [1962,] -9.003450887 43.25051
FALSE [1963,] -8.985157430 43.23865
FALSE [1964,] -8.958337362 43.23927
FALSE [1965,] -8.931930705 43.24703
FALSE [1966,] -8.914722453 43.25669
FALSE [1967,] -8.935806438 43.25576
FALSE [1968,] -8.947485311 43.26165
FALSE [1969,] -8.962419800 43.28403
FALSE [1970,] -8.966915649 43.28372
FALSE [1971,] -8.979111288 43.28868
FALSE [1972,] -8.987482870 43.29467
FALSE [1973,] -8.980144816 43.29769
FALSE [1974,] -8.970145427 43.29829
FALSE [1975,] -8.929863647 43.31147
FALSE [1976,] -8.887385620 43.33237
FALSE [1977,] -8.856018026 43.33865
FALSE [1978,] -8.848473267 43.34573
FALSE [1979,] -8.840618449 43.35064
FALSE [1980,] -8.829352987 43.35294
FALSE [1981,] -8.816382203 43.34756
FALSE [1982,] -8.785014608 43.32415
FALSE [1983,] -8.767858032 43.31878
FALSE [1984,] -8.749822957 43.31663
FALSE [1985,] -8.711168986 43.30720
FALSE [1986,] -8.692462117 43.30514
FALSE [1987,] -8.664711873 43.31286
FALSE [1988,] -8.629468546 43.32756
FALSE [1989,] -8.591899781 43.33588
FALSE [1990,] -8.557741658 43.32498
FALSE [1991,] -8.505341756 43.34325
FALSE [1992,] -8.496944336 43.34945
FALSE [1993,] -8.493611206 43.35834
FALSE [1994,] -8.485498006 43.36596
FALSE [1995,] -8.475421102 43.37136
FALSE [1996,] -8.455060588 43.37511
FALSE [1997,] -8.450874797 43.37914
FALSE [1998,] -8.448290975 43.38366
FALSE [1999,] -8.442348186 43.38704
FALSE [2000,] -8.387777873 43.39758
FALSE [2001,] -8.384057170 43.38436
FALSE [2002,] -8.375065471 43.37469
FALSE [2003,] -8.352947958 43.36035
FALSE [2004,] -8.340183878 43.37164
FALSE [2005,] -8.336669881 43.38071
FALSE [2006,] -8.339305379 43.40446
FALSE [2007,] -8.330158651 43.41735
FALSE [2008,] -8.310108195 43.41479
FALSE [2009,] -8.280962687 43.40131
FALSE [2010,] -8.266544962 43.39769
FALSE [2011,] -8.260188761 43.38877
FALSE [2012,] -8.256416382 43.37738
FALSE [2013,] -8.249956828 43.36655
FALSE [2014,] -8.226909139 43.34981
FALSE [2015,] -8.216625529 43.34009
FALSE [2016,] -8.209597534 43.32498
FALSE [2017,] -8.201794393 43.34097
FALSE [2018,] -8.202414510 43.35637
FALSE [2019,] -8.209597534 43.38704
FALSE [2020,] -8.209029094 43.40236
FALSE [2021,] -8.204171509 43.41146
FALSE [2022,] -8.193319459 43.41854
FALSE [2023,] -8.174819296 43.42802
FALSE [2024,] -8.194404663 43.43492
FALSE [2025,] -8.212594768 43.43663
FALSE [2026,] -8.246494507 43.43482
FALSE [2027,] -8.264167847 43.43903
FALSE [2028,] -8.288197388 43.45799
FALSE [2029,] -8.304527140 43.46277
FALSE [2030,] -8.285923625 43.47373
FALSE [2031,] -8.185077067 43.48326
FALSE [2032,] -8.178100749 43.48507
FALSE [2033,] -8.170788533 43.48972
FALSE [2034,] -8.166396037 43.49626
FALSE [2035,] -8.167946330 43.50373
FALSE [2036,] -8.172803915 43.50445
FALSE [2037,] -8.195903280 43.49693
FALSE [2038,] -8.256726441 43.48944
FALSE [2039,] -8.253005738 43.49298
FALSE [2040,] -8.250163534 43.49461
FALSE [2041,] -8.243083862 43.49693
FALSE [2042,] -8.246907919 43.49944
FALSE [2043,] -8.256726441 43.50373
FALSE [2044,] -8.268612020 43.49063
FALSE [2045,] -8.288326579 43.48469
FALSE [2046,] -8.332484090 43.48326
FALSE [2047,] -8.324732626 43.49846
FALSE [2048,] -8.321063599 43.51962
FALSE [2049,] -8.316102661 43.53463
FALSE [2050,] -8.304527140 43.53104
FALSE [2051,] -8.291453004 43.54468
FALSE [2052,] -8.299566203 43.54995
FALSE [2053,] -8.307627727 43.55809
FALSE [2054,] -8.312640341 43.56804
FALSE [2055,] -8.311968546 43.57881
FALSE [2056,] -8.308041138 43.57881
FALSE [2057,] -8.290729533 43.57651
FALSE [2058,] -8.284063274 43.57881
FALSE [2059,] -8.260343791 43.57620
FALSE [2060,] -8.231663371 43.58724
FALSE [2061,] -8.086039184 43.66821
FALSE [2062,] -8.082473511 43.65721
FALSE [2063,] -8.073998576 43.65134
FALSE [2064,] -8.062888143 43.65057
FALSE [2065,] -8.051364298 43.65460
FALSE [2066,] -8.061854615 43.65403
FALSE [2067,] -8.064955200 43.65460
FALSE [2068,] -8.064955200 43.66075
FALSE [2069,] -8.060614380 43.66268
FALSE [2070,] -8.055808472 43.66591
FALSE [2071,] -8.051364298 43.66821
FALSE [2072,] -8.070536255 43.67961
FALSE [2073,] -8.073326783 43.69025
FALSE [2074,] -8.068572551 43.70090
FALSE [2075,] -8.064955200 43.71263
FALSE [2076,] -8.058754028 43.72113
FALSE [2077,] -8.043871216 43.72374
FALSE [2078,] -8.010333212 43.72346
FALSE [2079,] -7.980515910 43.72958
FALSE [2080,] -7.952403931 43.74178
FALSE [2081,] -7.927547567 43.75852
FALSE [2082,] -7.907910523 43.77805
FALSE [2083,] -7.880211955 43.77498
FALSE [2084,] -7.868429728 43.76061
FALSE [2085,] -7.860833293 43.74294
FALSE [2086,] -7.845847127 43.72968
FALSE [2087,] -7.845847127 43.72346
FALSE [2088,] -7.851634888 43.72586
FALSE [2089,] -7.861763469 43.72795
FALSE [2090,] -7.866982789 43.72968
FALSE [2091,] -7.874010783 43.72113
FALSE [2092,] -7.878661662 43.71224
FALSE [2093,] -7.879075073 43.70361
FALSE [2094,] -7.873183960 43.69617
FALSE [2095,] -7.883467570 43.69033
FALSE [2096,] -7.886671509 43.69142
FALSE [2097,] -7.894267945 43.69617
FALSE [2098,] -7.900572469 43.69147
FALSE [2099,] -7.903259644 43.68997
FALSE [2100,] -7.907910523 43.68868
FALSE [2101,] -7.907910523 43.68188
FALSE [2102,] -7.857732707 43.67992
FALSE [2103,] -7.848663493 43.68733
FALSE [2104,] -7.866982789 43.70922
FALSE [2105,] -7.855355591 43.71514
FALSE [2106,] -7.843211630 43.71555
FALSE [2107,] -7.818561971 43.70922
FALSE [2108,] -7.820732381 43.71245
FALSE [2109,] -7.823367880 43.71976
FALSE [2110,] -7.825331584 43.72346
FALSE [2111,] -7.811378947 43.73485
FALSE [2112,] -7.793214681 43.74586
FALSE [2113,] -7.773086710 43.75431
FALSE [2114,] -7.733450887 43.76180
FALSE [2115,] -7.712160197 43.77245
FALSE [2116,] -7.695106975 43.78668
FALSE [2117,] -7.688208170 43.80169
FALSE [2118,] -7.684926717 43.80518
FALSE [2119,] -7.677743693 43.80219
FALSE [2120,] -7.670664022 43.79456
FALSE [2121,] -7.667666789 43.78425
FALSE [2122,] -7.672007609 43.77836
FALSE [2123,] -7.695055298 43.75756
FALSE [2124,] -7.695520386 43.74317
PeninSpain<-SpatialPolygons(list(
  Polygons(list(
    spainmap@polygons[[1]]@Polygons[[1]]),ID=1)),
  proj4string = CRS(projection(spainmap)))

# Podemos explorar más los polígonos:

length(spainmap@polygons[[1]]@Polygons) # hay 17 polígonos
FALSE [1] 17
# Podemos dibujar diferentes subpolígonos, por ejemplo el segundo:
plot(SpatialPolygons(list(
  Polygons(list(
    spainmap@polygons[[1]]@Polygons[[2]]),ID=2)
  ),
  proj4string = CRS(projection(spainmap))
  )
  )
FALSE Error : The fig.showtext code chunk option must be TRUE

# Si quisiéramos seleccionar varios polígonos, dentro de la lista habría que repetir
# la línea donde seleccionamos los polígonos una detrás de otra.

Ahora vamos a representar en la península la distribución del lince:

plot(PeninSpain) # dibujamos el polígono peninsular
FALSE Error : The fig.showtext code chunk option must be TRUE

# Encima dibujamos el lince:

plot(pres.lynx, pch=20, col="cyan4")
FALSE Error : The fig.showtext code chunk option must be TRUE
plot(PeninSpain, add=T)

# Añadimos el fondo gris:

plot(PeninSpain, add=F,col="lightgrey",border="grey")
FALSE Error : The fig.showtext code chunk option must be TRUE
plot(pres.lynx, pch=20, col="cyan4",add=T)

Guardardamos el shapefile de puntos:

td <- file.path(getwd(), "data") #creamos una nueva carpeta donde guardarlo

writeOGR(pres.lynx, dsn=td,# dt es la dirección fisica, en este caso para no escribir toda la dirección hacemos un directorio y lo guardamos en td 
         layer="lince", driver="ESRI Shapefile")# como un shapefile tiene muchos archivos con esto consigo generar el shapefile sin ir archivo por archivo
FALSE Error in writeOGR(pres.lynx, dsn = td, layer = "lince", driver = "ESRI Shapefile"): layer exists, use a new layer name
# Guardamos el shapefile de polígonos para ello debemos convertir el objeto a
# PeninSpain a un objeto SpatialPolygonsDataFrame:

PeninDF<-SpatialPolygonsDataFrame(PeninSpain,data=data.frame(ID=1))
writeOGR(PeninDF, dsn=td, 
         layer="Espanapenin", driver="ESRI Shapefile")
FALSE Error in writeOGR(PeninDF, dsn = td, layer = "Espanapenin", driver = "ESRI Shapefile"): layer exists, use a new layer name

Para cargar los shapefiles guardados lo hariamos de la siguiente forma:

PeninDF <- readOGR("data/Espanapenin.shp")
FALSE OGR data source with driver: ESRI Shapefile 
FALSE Source: "C:\Users\tsuba\OneDrive\Escritorio\MANUAL\data\Espanapenin.shp", layer: "Espanapenin"
FALSE with 1 features
FALSE It has 1 fields
plot(PeninDF)
FALSE Error : The fig.showtext code chunk option must be TRUE
presencias.lynx <- readOGR("data/lince.shp")
FALSE OGR data source with driver: ESRI Shapefile 
FALSE Source: "C:\Users\tsuba\OneDrive\Escritorio\MANUAL\data\lince.shp", layer: "lince"
FALSE with 1102 features
FALSE It has 1 fields
plot(presencias.lynx, add=T)

Observar la presencia de lince en los parques nacionales españoles

Primero cargamos el archivo shapefile de los parques nacionales:

pns<-readOGR("DataScienceUAH-main/data/Red_PN_LIM/Limites_PyB.shp")
FALSE Warning in OGRSpatialRef(dsn, layer, morphFromESRI = morphFromESRI, dumpSRS =
FALSE dumpSRS, : Discarded datum European_Terrestrial_Reference_System_1989 in Proj4
FALSE definition: +proj=utm +zone=30 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m
FALSE +no_defs
FALSE OGR data source with driver: ESRI Shapefile 
FALSE Source: "C:\Users\tsuba\OneDrive\Escritorio\MANUAL\DataScienceUAH-main\data\Red_PN_LIM\Limites_PyB.shp", layer: "Limites_PyB"
FALSE with 12 features
FALSE It has 11 fields
plot(pns, col='red', add=T) # así no me dibuja nada, puede ser que esten 
FALSE Error in polypath(x = mcrds[, 1], y = mcrds[, 2], border = border, col = col, : plot.new has not been called yet
                            # en diferentes proyecciones

# si le doy add = F se me dibujan  solo los polígonos
plot(pns, col='red', add=F)
FALSE Error : The fig.showtext code chunk option must be TRUE

Comprobamos la proyección:

projection(pns) 
FALSE [1] "+proj=utm +zone=30 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs"

La proyección es diferente, n lo anterior seguimos una proyección WGS y en los parques nacionales tenemos una proyección UTM. Cambiamos la proyección de los parques de UTM a WGS con spTransform, así hacemos una transformación espacial:

pns.geo<-spTransform(pns,crs.geo)

# Comprobamos la proyección:
projection(pns.geo)
FALSE [1] "+proj=longlat +datum=WGS84 +no_defs"
# Añadimos los parques:
plot(PeninDF)
FALSE Error : The fig.showtext code chunk option must be TRUE
plot(presencias.lynx, add=T)
plot(pns.geo,add=T)

Ahora vamos a limpiar un poco nuestros datos, en primer lugar nos vamos a quedar solo con el nombre de cada parque y vamos a eliminar el parque de las islas Baleares:

pns.geo@data$NOM_PARQUE
FALSE  [1] "Parque Nacional Marítimo-Terrestre del Archipiélago de Cabrera"             
FALSE  [2] "Parque Nacional de la Sierra de Guadarrama"                                   
FALSE  [3] "Parque Nacional Ordesa y Monte Perdido"                                       
FALSE  [4] "Parque Nacional Marítimo-Terrestre de las Islas Atlánticas de Galicia"      
FALSE  [5] "Parque Nacional de Cabañeros"                                                
FALSE  [6] "Parque Nacional de Monfragüe"                                                
FALSE  [7] "Parque Nacional de Sierra Nevada"                                             
FALSE  [8] "Parque Nacional Tablas de Daimiel"                                            
FALSE  [9] "Parque Nacional de Aigüestortes i Estany de Sant Maurici"                    
FALSE [10] "Parque Nacional de los Picos de Europa"                                       
FALSE [11] "Parque Nacional de Doñana"                                                   
FALSE [12] "Ã\201rea de Especial Protección del Parque Nacional de la Sierra de Guadarrama."
pnsSpain<-pns.geo[-1,1]

Superponemos las dos capas y extraer información de una a partir de la otra, hacemos así una extracción geográfica:

pres.lynx
FALSE class       : SpatialPointsDataFrame 
FALSE features    : 1106 
FALSE extent      : -8.95937, 1.9197, 36.79, 42.261  (xmin, xmax, ymin, ymax)
FALSE crs         : +proj=longlat +datum=WGS84 +no_defs 
FALSE variables   : 1
FALSE names       :  country 
FALSE min values  : Portugal 
FALSE max values  :    Spain
pns.geo
FALSE Object of class "SpatialPolygonsDataFrame" (package sp):
FALSE 
FALSE Number of SpatialPolygons:  12
FALSE 
FALSE Variables measured:
FALSE                                                                NOM_PARQUE
FALSE 0        Parque Nacional Marítimo-Terrestre del Archipiélago de Cabrera
FALSE 1                              Parque Nacional de la Sierra de Guadarrama
FALSE 2                                  Parque Nacional Ordesa y Monte Perdido
FALSE 3 Parque Nacional Marítimo-Terrestre de las Islas Atlánticas de Galicia
FALSE 4                                           Parque Nacional de Cabañeros
FALSE 5                                           Parque Nacional de Monfragüe
FALSE    FECHA_DEC
FALSE 0 29/04/1991
FALSE 1 25/06/2013
FALSE 2 16/08/1918
FALSE 3 01/07/2002
FALSE 4 20/11/1995
FALSE 5 02/03/2007
FALSE                                                                                             NORMATIVA
FALSE 0                                                                          Ley 14/1991 de 29 de Abril
FALSE 1         Ley 7/2013, del 25 de Junio, de declaración del Parque Nacional de la Sierra de Guadarrama
FALSE 2 RD 16/08/1918, declaración del Parque Nacional Valle de Ordesa.Gaceta de Madrid, nº250,18/08/1918
FALSE 3                                                                          Ley 15/2002, de 1 de Julio
FALSE 4  Ley 33/95 de 20 de noviembre, de declaración del P.N. de Cabañeros (BOE 278, de 21 de noviembre)
FALSE 5                                                                           Ley 1/2007, de 2 de marzo
FALSE                                                                                                                                                     PORN
FALSE 0                                                                                                            Real Decreto 1431/1992, de 27 de noviembre,
FALSE 1                                                                                                                                                   <NA>
FALSE 2                                                                                                                                                   <NA>
FALSE 3 Decreto 274/99, de 21 de octubre, por el que se aprueba el Plan de Ordenación de los Recursos Naturales de las Islas Atlánticas. DOG nº 209 28/10/9
FALSE 4                                                                                                                        Decreto 23/1995, de 28 de marzo
FALSE 5                                                                                                                       Decreto 186/2005, de 26 de julio
FALSE        TIPO_CENTR
FALSE 0 Parque Nacional
FALSE 1 Parque Nacional
FALSE 2 Parque Nacional
FALSE 3 Parque Nacional
FALSE 4 Parque Nacional
FALSE 5 Parque Nacional
FALSE                                                                                                                                                     PRUG
FALSE 0                                                                                               Decreto 58/2006, de 1 de julio , BOIB Num. 97 11-07-2006
FALSE 1                                                                                                                                                   <NA>
FALSE 2                                                           Real Decreto 409/1995 de 17 de  marzo, por el que se aprueba el Plan Rector de Uso y Gestion
FALSE 3 Decreto 88/2002,7 de marzo, Plan de Ordenación de los Recursos naturales del Espacio Natural de la Isla de Cortegada y su entorno. DOG nº 62, 01/04/
FALSE 4                                                                                                                               Pendiente de Aprobación
FALSE 5                                                                                                                      Decreto 13/2014, de 18 de febrero
FALSE                                                                                                                                                                                                                                                   AMPLIACION
FALSE 0                                                                                                                                                                                                                                                       <NA>
FALSE 1                                                                                                                                                                                                                                                       <NA>
FALSE 2                                                                                                              Ley 52/1982, de 13 de julio de reclasificación y ampliación del Parque Nacional de Ordesa y Monte Perdido.BOE, nº 181, 30 de julio de 1982
FALSE 3                                                                                                                                                                                                                                                       <NA>
FALSE 4 Resolución de 15 de noviembre de 2005, por la que se hace público el Acuerdo del Consejo de Ministros por el que se amplían los límites del P. N. de Cabañeros por incorporación de terrenos colindantes al mismo. (BOE nº 293, de 8 diciembre de 2
FALSE 5                                                                                                                                                                                                                                                       <NA>
FALSE                                                                                                                                      RECLASIFIC
FALSE 0                                                                                                                                          <NA>
FALSE 1                                                                                                                                          <NA>
FALSE 2 Ley 52/1982, de 13 de julio de reclasificación y ampliación del Parque Nacional de Ordesa y Monte Perdido.BOE, nº 181, 30 de julio de 1982
FALSE 3                                                                                                                                          <NA>
FALSE 4                                                                                                                                          <NA>
FALSE 5                                                                                                                                          <NA>
FALSE   SHAPE_Leng SHAPE_Le_1 SHAPE_Area
FALSE 0   40966.10   40966.10  100917218
FALSE 1  274197.79  274197.79  339598772
FALSE 2   92158.77   92158.77  156916671
FALSE 3   79272.92   79272.92   85426204
FALSE 4  171203.38  171203.38  409070770
FALSE 5  106257.15  106257.15  180099684
FALSE ...
lynxinpark <- over(pns.geo,pres.lynx)# aquí saca en que parques hay linces
lynxinpark <- over(pres.lynx,pns.geo)# aquí me da el nº de observaciones de linces 
                                     # que caen en parques nacionales

Eliminamos los NA haciendo un subset:

# Quitamos NA del dataframe
lynxinpark.filter <- subset(lynxinpark, !is.na(SHAPE_Leng))

# Eliminamos los nombres de los parques donde hay NA de la presencia del lince
lynxinpark.filter$NOM_PARQUE
FALSE  [1] "Parque Nacional de Doñana"       "Parque Nacional de Doñana"      
FALSE  [3] "Parque Nacional de Doñana"       "Parque Nacional de Doñana"      
FALSE  [5] "Parque Nacional de Cabañeros"    "Parque Nacional de Cabañeros"   
FALSE  [7] "Parque Nacional de Doñana"       "Parque Nacional de Monfragüe"   
FALSE  [9] "Parque Nacional de Cabañeros"    "Parque Nacional de Cabañeros"   
FALSE [11] "Parque Nacional de Cabañeros"    "Parque Nacional de Sierra Nevada"
FALSE [13] "Parque Nacional de Doñana"       "Parque Nacional de Doñana"      
FALSE [15] "Parque Nacional de Doñana"       "Parque Nacional de Doñana"
# Contamos la presencia de lince en parques nacionales
table(lynxinpark$NOM_PARQUE[!is.na(lynxinpark$NOM_PARQUE)])
FALSE 
FALSE    Parque Nacional de Cabañeros       Parque Nacional de Doñana 
FALSE                                5                                9 
FALSE    Parque Nacional de Monfragüe Parque Nacional de Sierra Nevada 
FALSE                                1                                1

5.1.5. Extracción de información apartir de raster, uso del paquete raster

Vamos a trabajar con temperaturas, primero nos descargamos datos de las temperaturas máximas mundiales en el mes de enero y julio:

tempmax <- getData("worldclim", var="tmax", res=10)   

plot(tempmax[[1]],main="Temperatura máxima Enero")
FALSE Error : The fig.showtext code chunk option must be TRUE
FALSE Error : The fig.showtext code chunk option must be TRUE

plot(tempmax[[7]],main="Temperatura máxima Julio")
FALSE Error : The fig.showtext code chunk option must be TRUE
FALSE Error : The fig.showtext code chunk option must be TRUE

Cargamos archivos raster de las temperaturas y precipitaciones del 15 de enero y del 15 de julio de 2007 en España:

temp.Spain.jan07<-raster("DataScienceUAH-main/data/temp.Spain.jan07.tif")
temp.Spain.jul07<-raster("DataScienceUAH-main/data/temp.Spain.jul07.tif")

Mapeamos los raster cargados:

plot(temp.Spain.jan07,main="Temperatura máxima 15 Enero 2007")
FALSE Error : The fig.showtext code chunk option must be TRUE
FALSE Error : The fig.showtext code chunk option must be TRUE

plot(temp.Spain.jul07,main="Temperatura máxima 15 Julio 2007")
FALSE Error : The fig.showtext code chunk option must be TRUE
FALSE Error : The fig.showtext code chunk option must be TRUE

Podemos cortar archivos raster con el comando crop. Esto puede hacerse en base a un extent indicando coordenadas máximas y mínimas (xmin, xmax, ymin, ymax):

extent.spain <- extent(-9.35, 4.45, 35.95, 43.85)
temp.jan.world.cropped<-crop(tempmax[[1]],extent.spain) # desde un raster del mundo, cortamos

plot(temp.jan.world.cropped)
FALSE Error : The fig.showtext code chunk option must be TRUE
FALSE Error : The fig.showtext code chunk option must be TRUE

Extraemos valores a partir del archivo raster, vamos a dibujar los parques nacionales sobre el raster de temperatura:

plot(temp.Spain.jan07)
FALSE Error : The fig.showtext code chunk option must be TRUE
FALSE Error : The fig.showtext code chunk option must be TRUE
plot(pns.geo, add=T)

tempjanPN <- extract(temp.Spain.jan07,pns.geo)
names(tempjanPN) <- pns.geo$NOM_PARQUE

Así ahora tenemos una lista de los parques con las temperaturas máximas que tuvieron el 15 de enero de 2007. Posteriormente, por medio de un loop podríamos asignar los valores de temperatura máxima al shapefile de los parques.

5.2. Mapas de puntos con ggplot:

Vamos a generar un mapa de la Isla de la Palma utilizando una base de datos que recopila información de la erupción de 2021, realizaremos mapas de puntos y para ello necesitaremos las siguientes librerías:

library(tidyverse)
library(lubridate)
library(ggthemes)
library(wesanderson)
library(sf)
library (leaflet)
library (ggmap)
library(htmlwidgets)
library(RColorBrewer)

Vamos a trabajar con la temperatura así que cargamos datos de la temperatura:

thermal_traits <- read_csv("cumbre_vieja_visualdata-main/thermal_traits_complete.csv")
FALSE Rows: 4120 Columns: 29
FALSE -- Column specification --------------------------------------------------------
FALSE Delimiter: ","
FALSE chr  (8): authors, title, DOI, order, family, genus, species, feeding_guild
FALSE dbl (21): a_est, a_se, tmin, tmin_se, tmax, tmax_se, topt, topt_se, start_a,...
FALSE 
FALSE i Use `spec()` to retrieve the full column specification for this data.
FALSE i Specify the column types or set `show_col_types = FALSE` to quiet this message.
str(thermal_traits)
FALSE spec_tbl_df [4,120 x 29] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
FALSE  $ a_est          : num [1:4120] 7.07e-05 7.87e-05 7.48e-05 9.22e-05 6.93e-05 ...
FALSE  $ a_se           : num [1:4120] 7.52e-06 8.47e-06 8.20e-06 8.92e-06 7.99e-06 ...
FALSE  $ tmin           : num [1:4120] 3.25 3.58 4.37 6.13 2.64 ...
FALSE  $ tmin_se        : num [1:4120] 1.217 1.243 1.224 0.934 1.419 ...
FALSE  $ tmax           : num [1:4120] 33.3 33.4 33.3 33.3 33.4 ...
FALSE  $ tmax_se        : num [1:4120] 0.352 0.353 0.308 0.315 0.379 ...
FALSE  $ topt           : num [1:4120] 27 27.1 27.1 27.4 27 ...
FALSE  $ topt_se        : num [1:4120] 0.283 0.282 0.257 0.254 0.301 ...
FALSE  $ start_a        : num [1:4120] 6e-05 8e-05 7e-05 9e-05 7e-05 8e-05 9e-05 9e-05 6e-05 8e-05 ...
FALSE  $ start_tmin     : num [1:4120] 1 4 4 6 3 4 5 5 1 4 ...
FALSE  $ start_tmax     : num [1:4120] 33.5 33.5 33.5 33.5 33.5 33.5 33.5 33.5 33.5 33.5 ...
FALSE  $ id             : num [1:4120] 1 1 1 1 1 1 1 1 1 1 ...
FALSE  $ authors        : chr [1:4120] "de Campos" "de Campos" "de Campos" "de Campos" ...
FALSE  $ Year           : num [1:4120] 2021 2021 2021 2021 2021 ...
FALSE  $ title          : chr [1:4120] "Thermal biology ofTuta absoluta:demographic parameters and facultative diapause" "Thermal biology ofTuta absoluta:demographic parameters and facultative diapause" "Thermal biology ofTuta absoluta:demographic parameters and facultative diapause" "Thermal biology ofTuta absoluta:demographic parameters and facultative diapause" ...
FALSE  $ DOI            : chr [1:4120] "10.1007/s10340-020-01286-8" "10.1007/s10340-020-01286-8" "10.1007/s10340-020-01286-8" "10.1007/s10340-020-01286-8" ...
FALSE  $ vi             : num [1:4120] 0.00789 0.00789 0.00789 0.00789 0.00789 0.00789 0.00789 0.00789 0.00789 0.00789 ...
FALSE  $ order          : chr [1:4120] "Lepidoptera" "Lepidoptera" "Lepidoptera" "Lepidoptera" ...
FALSE  $ family         : chr [1:4120] "Gelechiidae" "Gelechiidae" "Gelechiidae" "Gelechiidae" ...
FALSE  $ genus          : chr [1:4120] "Tuta" "Tuta" "Tuta" "Tuta" ...
FALSE  $ species        : chr [1:4120] "absoluta" "absoluta" "absoluta" "absoluta" ...
FALSE  $ feeding_guild  : chr [1:4120] "borer" "borer" "borer" "borer" ...
FALSE  $ lat            : num [1:4120] 42.6 42.6 42.6 42.6 42.6 ...
FALSE  $ sd_median      : num [1:4120] 0.0499 0.0499 0.0499 0.0499 0.0499 ...
FALSE  $ thermal_breadth: num [1:4120] 17.8 17.7 17.4 16.7 18 ...
FALSE  $ t50_left       : num [1:4120] 15.5 15.7 15.9 16.6 15.4 ...
FALSE  $ t50_right      : num [1:4120] 33.3 33.4 33.3 33.3 33.4 ...
FALSE  $ tsm            : num [1:4120] 6.31 6.29 6.18 5.98 6.4 ...
FALSE  $ therm_range    : num [1:4120] 30 29.8 28.9 27.2 30.7 ...
FALSE  - attr(*, "spec")=
FALSE   .. cols(
FALSE   ..   a_est = col_double(),
FALSE   ..   a_se = col_double(),
FALSE   ..   tmin = col_double(),
FALSE   ..   tmin_se = col_double(),
FALSE   ..   tmax = col_double(),
FALSE   ..   tmax_se = col_double(),
FALSE   ..   topt = col_double(),
FALSE   ..   topt_se = col_double(),
FALSE   ..   start_a = col_double(),
FALSE   ..   start_tmin = col_double(),
FALSE   ..   start_tmax = col_double(),
FALSE   ..   id = col_double(),
FALSE   ..   authors = col_character(),
FALSE   ..   Year = col_double(),
FALSE   ..   title = col_character(),
FALSE   ..   DOI = col_character(),
FALSE   ..   vi = col_double(),
FALSE   ..   order = col_character(),
FALSE   ..   family = col_character(),
FALSE   ..   genus = col_character(),
FALSE   ..   species = col_character(),
FALSE   ..   feeding_guild = col_character(),
FALSE   ..   lat = col_double(),
FALSE   ..   sd_median = col_double(),
FALSE   ..   thermal_breadth = col_double(),
FALSE   ..   t50_left = col_double(),
FALSE   ..   t50_right = col_double(),
FALSE   ..   tsm = col_double(),
FALSE   ..   therm_range = col_double()
FALSE   .. )
FALSE  - attr(*, "problems")=<externalptr>

Al final no podemos utilizar esta base por que existe un error (creo que no tenemos los datos de longitud), así que trabajaremos con la base de datos que recopila información de los seísmos:

data_cumbre_vieja <- read_csv("cumbre_vieja_visualdata-main/data_cumbre_vieja.csv")
FALSE Rows: 332 Columns: 19
FALSE -- Column specification --------------------------------------------------------
FALSE Delimiter: ","
FALSE chr   (2): Max. int, Region
FALSE dbl  (16): Latitude, Longitude, Depth, Magnitude, day, pm1, pm10, pm25, temp...
FALSE date  (1): date
FALSE 
FALSE i Use `spec()` to retrieve the full column specification for this data.
FALSE i Specify the column types or set `show_col_types = FALSE` to quiet this message.

Vamos a representar un mapa de la palma, sobre el que iremos añadiendo cosas:

mapa_1 <- ggplot(data= data_cumbre_vieja, aes(x = Longitude, y= Latitude))+
  borders("world",
          colour = "gray",
          fill = "gray")+
  geom_point(alpha = 0.35,
             size = 3)+
  theme_clean()
mapa_1
FALSE Error : The fig.showtext code chunk option must be TRUE

Hemos creado un mapa del mundo, así que vamos a hacer un zoom con las coordenadas:

mapa_zoom <- ggplot(data= data_cumbre_vieja, aes(x = Longitude, y= Latitude))+
  borders("world",
          colour = "gray",
          fill = "gray")+
  coord_sf(xlim = c(-18, -17),
           ylim = c(28, 29),
           expand = FALSE)+
  geom_point(alpha = 0.35,
             size = 3)+
  theme_clean()
mapa_zoom
FALSE Error : The fig.showtext code chunk option must be TRUE

Como hacemos un zoom tan grande estamos perdiendo mucha resolución en el mapa, si quisieramos hacer un mapa más bonito habría que hacer un shapefile con todas las coordenadas de canarias, pero este mapa nos sirve para trabajar.

Si queremos guardar una figura realizada con ggplot podemos utilizar ggsave, siguiendo el siguiente esqueleto:

ggsave ("archivoconlaextension.jpg", width = 16, height = 16, units = "cm",
        dpi = 300)
FALSE Error : The fig.showtext code chunk option must be TRUE
# Donde dpi es la resolución y por defecto es 300, unidades si son grandes pues ayuda a no perder resolución con zoom

Creación de un mapa interactivo, leaflet y ggmap

Generamos una paleta de colores:

mycolors <- c(2,3,4,5,6)# paleta de colores personal donde se han
                        # seleccionado los colores con la posición
mypalette <- colorBin(palette="YlOrBr", 
                      domain=data_cumbre_vieja$Magnitude, 
                      na.color="transparent", 
                      bins= mycolors) # seleccionamos los colores de la paleta YlOrBr
                                      # según su posición con el vector mycolors

# domain me permite indicar que quiero colorear con la paleta

Creamos un texto para que salga con el html:

mytext <- paste(
  "Date: ", data_cumbre_vieja$date,"<br/>", 
  "Magnitude: ", data_cumbre_vieja$Magnitude, "<br/>", 
  "Depth: ", data_cumbre_vieja$Depth, 
  sep="") %>%
  lapply(htmltools::HTML)
# paste pega texto y con  las líneas de debajo le indico que con cada dato se pegue # la información correspondiente y con lapply lo hacemos interactivo

Ahora definimos el mapa:

lapalma_earthquakes_maps <- leaflet(data = data_cumbre_vieja) %>% 
  addTiles() %>% 
  addCircleMarkers(~Longitude, # ~ es en función de...
                   ~Latitude,
                   stroke = FALSE,
                   fillColor = ~mypalette(Magnitude), 
                   fillOpacity = 0.8, 
                   color = ~mypalette(Magnitude), 
                   popup = ~Magnitude, # que nos salga el texto sobre la imagen
                   label = mytext,
                   labelOptions = labelOptions( 
                     style = list("font-weight" = "normal", padding = "3px 8px"), 
                     textsize = "13px", 
                     direction = "auto"))

Podemos añadir una imagen raster de satélite para darle un aspecto más realista a nuestro mapa con el siguiente código:

addProviderTiles('Esri.WorldImagery') %>%
  addLegend(pal=mypalette, values=~Magnitude, opacity=0.9, title = "Magnitude", position = "bottomleft")
FALSE Error: $ operator is invalid for atomic vectors
saveWidget(lapalma_earthquakes_maps,
           file=paste0(getwd(),"/lapalma_earthquakes_maps.html"))

Aplicamos todo a la vez:

lapalma_earthquakes_maps <- leaflet(data = data_cumbre_vieja) %>% 
  addTiles() %>% 
  addCircleMarkers(~Longitude, #~ es en función de...
                   ~Latitude,
                   stroke = FALSE,
                   fillColor = ~mypalette(Magnitude), 
                   fillOpacity = 0.8, 
                   color = ~mypalette(Magnitude), 
                   popup = ~Magnitude,#que nos salga el texto sobre la imagen
                   label = mytext,
                   labelOptions = labelOptions( 
                     style = list("font-weight" = "normal", padding = "3px 8px"), 
                     textsize = "13px", 
                     direction = "auto")) %>%
  addProviderTiles('Esri.WorldImagery') %>%
  addLegend(pal=mypalette, values=~Magnitude, opacity=0.9, title = "Magnitude", position = "bottomleft")

lapalma_earthquakes_maps

Guardamos nuestro mapa como html:

saveWidget(lapalma_earthquakes_maps,
           file=paste0(getwd(),"/lapalma_earthquakes_maps.html"))

¿Cómo dejar un mapa interactivo accesible en GitHub?

1.Debemos guardar el mapa como “index.html”

2.Subirlo a nuestro repositorio GitHub

3.Acceder a “settings”, donde pincharemos sobre “pages” y es tablecemos un url para nuestro mapa a partir de la rama principal del repositorio.

¿Y si tenemos varios mapas?

Puesto que el nombre de nuestro archivo siempre va a ser “index.html” tenemos dos opciones:

  • Generar un repositorio diferente para cada mapa (lo cual es un poco contraproducente)

  • Generar capas, lo que hacemos es añadir en el comando de leaflet con add los mapas como si fueran capas y configurar la leyenda para que nos salgan pestañas en las que podamos seleccionar que mapa queremos ver